HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...

树状数组。。。

Different GCD Subarray Query

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1541    Accepted Submission(s): 599


Problem Description
This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, he comes up with a new problem about GCD. Easy as it looks, Bob cannot figure it out himself. Now he turns to you for help, and here is the problem:
  
  Given an array a of N positive integers a1,a2,aN1,aN; a subarray of a is defined as a continuous interval between a1 and aN. In other words, ai,ai+1,,aj1,aj is a subarray of a, for 1ijN. For a query in the form (L,R), tell the number of different GCDs contributed by all subarrays of the interval [L,R].
  

 

Input
There are several tests, process till the end of input.
  
  For each test, the first line consists of two integers N and Q, denoting the length of the array and the number of queries, respectively. N positive integers are listed in the second line, followed by Q lines each containing two integers L,R for a query.

You can assume that 
  
    1N,Q100000 
    
   1ai1000000

 

Output
For each query, output the answer in one line.

 

Sample Input
5 3
1 3 4 6 9
3 5
2 5
1 5

 

Sample Output
6
6
6

 

Source
2016 ACM/ICPC Asia Regional Dalian Online

 

 

这个题的意思就是问区间内所有子段不同gcd的个数。

一开始理解错了题意,后来想明白了。假设区间的数为1 2 3 4

就是gcd(1),gcd(2),gcd(3),gcd(4),gcd(1,2),gcd(2,3),gcd(3,4),gcd(1,2,3),gcd(2,3,4),gcd(1,2,3,4)这些里面不同的gcd的个数是多少。

如果用在线算法操作,每查询一次就要处理依次数据,一方面会造成浪费,另一方面,你这样写妥妥的超时啊,所以要用离线算法,将所有的数据处理好之后,按顺序直接输出结果就可以。

首先用一个数组将数据保存起来,然后用一个vector数组将查询的区间和查询的顺序记录下来。

处理数据,就是相对来说固定右端点,从右往左移,在代码里就是对于每一个i(固定右端点),遍历一下i所在的子段的gcd,因为i不变,j是上一个i的gcd的值保存的顺序,j越大,i所在的子段就依次向左增加一个数,如果gcd发生了变化,就记录一下这个gcd以及出现的位置。可能越说越乱,画一个图表示一下。。。

图的意思就是假设数据为2 4 9 6 5,i为下标。假设i为4,就是固定4,然后遍历j,j存的是上一个i的子段的gcd,通过上一个i的gcd来得到i为4时(6)的子段的gcd,图中画的横线的长度就是子段的长度,橙色的矩形包含的长度是上一个i处理出的数据。就是固定右端点,依次往左遍历得到所有的gcd,这样不会重复操作,也不会漏掉某个子段。

将gcd整理出来之后,怎么操作才能使得区间查询的是不同的gcd的个数呢?

对于区间内相同的gcd,让标记gcd的下标尽量右移,找该gcd的最大右端点。

通过树状数组维护gcd的下标。

一边维护,一边查询树状数组就可以保证数据正确。

总结一下就是:固定右端点,依次往左找出来所有的gcd,并标记下标,因为是i逐渐增大的,所以后面遍历的时候也是相同gcd的最大右端点。直接查询就可以。

就这样吧,不想好好写了。

 

代码:

 1 //离线处理-树状数组
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 #include<utility>
11 using namespace std;
12 const int maxn=1e5+10;
13 int Arr[maxn];//存数据一开始的值
14 int N,Q;
15 int pos[maxn*10]; //记录gcd的位置
16 vector<pair<int ,int> >querys[maxn];
17 vector<pair<int, int> >gcds[maxn];
18 int ans[maxn];
19 int treeArr[maxn]; //树状数组
20 
21 int gcd(int a,int b){ //gcd求最大公约数
22     if(!(a%b))return b;
23     else return gcd(b,a%b);
24 }
25 
26 void init(){ //初始化
27     int tmp,ts;
28     for(int i=1;i<=N;i++){
29         tmp=Arr[i];
30         ts=i;                                     //固定右端点,向左遍历
31         for(int j=0;j<gcds[i-1].size();j++){
32             int tmpgcd=gcd(tmp,gcds[i-1][j].first);
33             if(tmpgcd!=tmp){  //如果gcd发生变化
34                 gcds[i].push_back(make_pair(tmp,ts)); //first存gcd,second存gcd的左端点ts
35                 ts=gcds[i-1][j].second; //上一个gcd的右端点就是下一个gcd的左端点
36                 tmp=tmpgcd;
37             }
38         }
39         gcds[i].push_back(make_pair(tmp,ts)); //将与上一个的最左端的gcd存起来
40     }
41     return;
42 }
43 
44 int lowbit(int x){  //取最低位的1
45     return x&(-x);
46 }
47 
48 void Add(int cur,int num){ //单点更新
49     for(int i=cur;i<=N;i+=lowbit(i))
50         treeArr[i]+=num;   //由叶子节点向上更新树状数组
51     return;
52 }
53 
54 int Query(int cur){ //区间查询  从右端点往左加二进制最低位1的
55     int sum=0;
56     for(int i=cur;i>0;i-=lowbit(i))
57         sum+=treeArr[i];
58     return sum;
59 }
60 
61 void Solve(){
62     memset(pos,0,sizeof(pos));
63     memset(treeArr,0,sizeof(treeArr));
64     for(int i=1;i<=N;i++){
65         for(int j=0;j<gcds[i].size();j++){
66             if(pos[gcds[i][j].first]){ //如果标记已经存在,就将标记去掉,所以执行单点更新操作
67                 Add(pos[gcds[i][j].first],-1);
68             }
69             Add(gcds[i][j].second,1);//一个新的不同的gcd,从叶子节点开始更新个数+1
70             pos[gcds[i][j].first]=gcds[i][j].second;//记录该gcd的右端点
71         }
72         for(int j=0;j<querys[i].size();j++){
73             ans[querys[i][j].second]=Query(i)-Query(querys[i][j].first-1);//区间右端点-区间左区间
74         }
75     }
76     for(int i=1;i<=Q;i++)
77         printf("%d\n",ans[i]);
78 
79     return;
80 }
81 int main(){
82     //reopen("input","r",stdin);
83     while(~scanf("%d%d",&N,&Q)){
84         for(int i=1;i<=N;i++){
85             scanf("%d",&Arr[i]); //将数据存在Arr数组中
86             querys[i].clear(); //清空
87             gcds[i].clear(); //清空
88         }
89         init();
90         int tmp1,tmp2;
91         for(int i=1;i<=Q;i++){
92             scanf("%d%d",&tmp1,&tmp2);
93             querys[tmp2].push_back(make_pair(tmp1,i)); //将tmp1与i成对插入vector的tmp2下标里
94         }
95         Solve();
96     }
97     return 0;
98 }

 

 

就这样吧,这题没什么,主要是想明白就很简单。

咸鱼太菜,学长要捶爆我的狗头吗???

已经做好了被学长打死的思想准备。。。

 

转载于:https://www.cnblogs.com/ZERO-/p/8672921.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ mmap写入速度_内存管理(24)mmap和缺页中断

相关文件&#xff1a;mm/mlock.cmm/util.cmm/mmap.cinclude/linux/slab.hmmap系统调用陷入内核中会调用vm_mmap_pgoff>do_mmap_pgoff函数来真正完成mmap操作1.1.do_mmap_pgoff函数(关键部分代码)do_mmap_pgoff16行&#xff1a;对需要映射的内存长度页对齐20行&#xff1a;ge…

邬贺铨院士:边缘计算“新十问”

来源&#xff1a;C114通信网作者&#xff1a;水易两年前的边缘计算技术峰会上&#xff0c;中国工程院院士邬贺铨就边缘计算提出十问&#xff0c;直戳技术演进与产业发展的核心问题&#xff0c;引起业内巨大反响。在过去两年中&#xff0c;边缘计算产业得到了长足发展&#xff0…

java 字符串第一个字符_深入Java源码剖析之字符串常量

字符串在Java生产开发中的使用频率是非常高的&#xff0c;可见&#xff0c;字符串对于我们而言非常关键。那么从C语言过来的同学会发现&#xff0c;在C中是没有String类型的&#xff0c;那么C语言要想实现字符串就必须使用char数组&#xff0c;通过一个个的字符来组拼成字符串。…

耗时11年,120页论文,中科大数学家成功证明微分几何核心猜想

大数据文摘出品近日&#xff0c;中国科技大学几何与物理研究中心创始主任陈秀雄教授与王兵教授团队发布论文“Space of Ricci flows (II)—Part B: Weak compactness of the flows”&#xff0c;在全球范围内率先证明了“哈密尔顿-田”和“偏零阶估计”这两个困扰数学界20多年的…

java 写入txt_Java线程转储的8个选项

线程转储是诊断CPU尖峰&#xff0c;死锁&#xff0c;内存问题&#xff0c;无响应的应用程序&#xff0c;较差的响应时间以及其他系统问题的重要工件。有很多很棒的在线线程转储分析工具&#xff0c;可以分析和发现问题。但是对于那些工具&#xff0c;您需要提供适当的线程转储作…

重磅!2020年度人类社会发展十大科学问题发布

来源&#xff1a;科技导报 在11月9日下午的第二届世界科技与发展论坛的闭幕式上&#xff0c;中国工程院院士、清华大学教授、《Research》编委周济和《柳叶刀》主编&#xff0c;爱思唯尔柳叶刀系列期刊总编辑、理查德霍顿共同发布了“2020年度人类社会发展十大科学问题”。本次…

前端导出excel文件带样式_vue前端使用xlsx导出数据到excel中--最简单的方式

最新项目中需要将页面数据导出到excel中&#xff0c;首先想到的就是度娘&#xff0c;得到的结果都是千篇一律&#xff0c;答案都是你复制我我复制你的&#xff0c;虽然能解决问题&#xff0c;但是这个过程也太复杂。既然无法改变&#xff0c;那就只好插手你的生活了。废话少说&…

7种情绪,人类心智的通用模块

来源&#xff1a;混沌巡洋舰1859年&#xff0c;达尔文以一个挑衅性的断言结束了他的《物种起源》&#xff0c;那就是‘人类的起源和他的历史将会被&#xff08;进化&#xff09;点亮’。在他的后期著作《人类的由来》(1和《人类与动物的情感表达》中&#xff0c;达尔文阐明了人…

gitbook mysql_使用Gitbook做笔记

一、安装# 通过npm全局安装npm install gitbook-cli -g# 查看版本gitbook --version二、创建一本书2.1 本地创建# 创建一个文件夹mkdir mysql-note# 初始化cd mysql-notegitbook init# 会创建两个文件# README.md 书皮# SUMMARY.md 目录# 从本地打开这本书gitbook serve# 将md文…

03、数据类型(02)

字典&#xff08;dict&#xff09; 字典是一种映射型的数据类型&#xff0c;每个元素成对出现&#xff0c;即key- value,每对元素key 和 value“&#xff1a;”冒号分开&#xff0c;元素之间用逗号隔开&#xff0c;整个字典包括子在{}中。 字典中的“key”必须是不可变类型&am…

器官复刻、脑机接口、电子皮肤…这些前沿科学或改写人类未来

来源&#xff1a;MEMS“2020年&#xff0c;新冠疫情爆发&#xff0c;面对困境&#xff0c;我们采取的行动将很可能改写这个时代。” 11月7日&#xff0c;2020腾讯科学WE大会线上举行。腾讯首席探索官网大为在开场演讲中表示&#xff0c;前沿科学突破能帮助我们做好准备拥抱未来…

GPT-3:人工智能的新突破

来源&#xff1a;王宏琳科学网博客在过去几个月里&#xff0c;占据海外科技新闻头条主导地位的、人工智能领域最令人兴奋的新事物之一是GPT-3——OpenAI的新的文本生成程序&#xff0c;一种由神经网络驱动的语言模型&#xff0c;一个根据人类用户的提示自动生成文本的人工智能引…

把 mysql 整个加载进内存磁盘中_MySQL 缓冲池 是什么?

Mysql 中数据是要落盘的&#xff0c;这点大家都知道。读写磁盘速度是很慢的&#xff0c;尤其和内存比起来更是没的说。但是&#xff0c;我们平时在执行 SQL 时&#xff0c;无论写操作还是读操作都能很快得到结果&#xff0c;并没有预想中的那么慢。可能你会说我有索引啊&#x…

Cell重磅:记忆研究的突破进展!在诺奖成果基础上,用“全光学”组合来“操纵记忆”...

来源&#xff1a;brainnews这项发表在《细胞》杂志上的研究&#xff0c;解释了研究人员如何利用双光子钙成像和双光子光遗传学的“全光学”组合&#xff0c;同时读写小鼠“位置细胞”&#xff08;神经元的一种&#xff09;中的活动&#xff0c;而这种细胞可以在虚拟现实环境中进…

mysql like 多个条件_千万级MySQL数据库这样建索引可以让你的数据库飞起来.........

创建索引常用规则1、表的主键、外键必须有索引&#xff1b;2、数据量超过300的表应该有索引&#xff1b;3、经常与其他表进行连接的表&#xff0c;在连接字段上应该建立索引&#xff1b;4、经常出现在Where子句中的字段&#xff0c;特别是大表的字段&#xff0c;应该建立索引&a…

mysql主从配置访问_Mysql主从配置,实现读写分离

大型网站为了软解大量的并发访问&#xff0c;除了在网站实现分布式负载均衡&#xff0c;远远不够。到了数据业务层、数据访问层&#xff0c;如果还是传统的数据结构&#xff0c;或者只是单单靠一台服务器扛&#xff0c;如此多的数据库连接操作&#xff0c;数据库必然会崩溃&…

靠脑机接口“隔空探物”,大脑植入芯片可实现“心灵感应”

来源&#xff1a;脑极体1979年&#xff0c;在四川大足县的12岁农村少年唐雨突然具有了“耳朵识字”的神通。原本是当地的一件稀罕的谈资&#xff0c;结果后来引起了当地媒体的报道&#xff0c;后来又居然经过中国的权威科技期刊《自然杂志》的“确证”和香港《明报》&#xff0…

android app 适应不同大小屏幕_移动APP测试:Android屏幕适配问题二

设计选择性的布局和图片&#xff0c;替代资源的类型&#xff0c;取决于应用程序的需求。通常&#xff0c;应该使用尺寸和方向限定符提供选择性的布局资源&#xff0c;使用密度限定符提供选择性的图片资源。以下部分分别概括了该如何使用尺寸和密度限定符提供选择性的布局和图片…

使用node中的express解决vue-cli加载不到dev-server.js的问题

在使用vue开发过程中&#xff0c;难免需要去本地数据地址进行请求&#xff0c;而原版配置在dev-server.js中&#xff0c;新版vue-webpack-template已经删除dev-server.js&#xff0c;改用webpack.dev.conf.js代替&#xff0c;所以 配置本地访问在webpack.dev.conf.js里配置即可…

脑机接口:从基础科学到神经康复

本文转自公众号&#xff1a;脑机接口社区大家好 &#xff0c;我是米格尔尼科莱利斯&#xff0c;美国杜克大学神经生物学、神经学和生物医学工程教授。今天我将为大家介绍脑机接口和这一技术从基础科学到应用于神经康复的研究历程。首先&#xff0c;我要感谢2020腾讯科学WE大会的…