【刷题】HDU 5869 Different GCD Subarray Query
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 \(a_1, a_2, \cdots a_{N-1}, a_N\) ; a subarray of \(a\) is defined as a continuous interval between \(a_1\) and \(a_N\) .In other words,\(a_i, a_{i+1}, \cdots, a_{j-1}, a_j\) is a subarray of \(a\), for \(1\le i\le j\le N\).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
\(1≤N,Q≤100000\)
\(1≤a_i≤1000000\)
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
Description(CHN)
给定一个数列,多次询问,每次询问 \(L,R\),求 \([L,R]\) 中所有子区间的 \(gcd\) 有多少种
Solution
预处理对于数列中的每个位置,对于它为 \(R\) 的所有区间中不同的 \(gcd\) 出现的最右边的 \(L\) 是什么。这个东西直接在上一个位置的基础上枚举就好了
将询问离线
我们用BIT维护每种 \(gcd\) 出现的区间的 \(L\) 的最右的位置在哪里,然后就用差分计算答案就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=300000+10;
int n,m,a[MAXN],ans[MAXN];
std::map<int,int> M;
std::vector< std::pair<int,int> > V[MAXN],query[MAXN];
struct BIT{
int C[MAXN];
inline void init()
{
memset(C,0,sizeof(C));
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,int k)
{
while(x<=n)C[x]+=k,x+=lowbit(x);
}
inline int sum(int x)
{
if(!x)return 0ll;
int res=0;
while(x>0)res+=C[x],x-=lowbit(x);
return res;
}
};
BIT T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
#define ft first
#define sd second
int main()
{
while(scanf("%d%d\n",&n,&m)!=EOF)
{
for(register int i=1;i<=n;++i)read(a[i]),V[i].clear(),query[i].clear();
T.init();M.clear();
V[1].push_back(std::make_pair(1,a[1]));
for(register int i=2;i<=n;++i)
{
int now=a[i];V[i].push_back(std::make_pair(i,a[i]));
for(register int j=0,lt=V[i-1].size();j<lt;++j)
{
std::pair<int,int> pr=V[i-1][j];
int d=std::__gcd(now,pr.sd);
if(d!=now)V[i].push_back(std::make_pair(pr.ft,d)),now=d;
}
}
for(register int i=1;i<=m;++i)
{
int l,r;read(l);read(r);
query[r].push_back(std::make_pair(i,l));
}
for(register int i=1;i<=n;++i)
{
for(register int j=0,lt=V[i].size();j<lt;++j)
{
std::pair<int,int> pr=V[i][j];
if(M[pr.sd])T.add(M[pr.sd],-1);
T.add(pr.ft,1);M[pr.sd]=pr.ft;
}
for(register int j=0,lt=query[i].size();j<lt;++j)
{
std::pair<int,int> pr=query[i][j];
ans[pr.ft]=T.sum(i)-T.sum(pr.sd-1);
}
}
for(register int i=1;i<=m;++i)printf("%d\n",ans[i]);
}
return 0;
}
【刷题】HDU 5869 Different GCD Subarray Query的更多相关文章
- HDU 5869 Different GCD Subarray Query rmq+离线+数状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...
- HDU 5869 Different GCD Subarray Query 离线+树状数组
Different GCD Subarray Query Problem Description This is a simple problem. The teacher gives Bob a ...
- hdu 5869 Different GCD Subarray Query BIT+GCD 2016ICPC 大连网络赛
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...
- HDU 5869 Different GCD Subarray Query
离线操作,树状数组,$RMQ$. 这个题的本质和$HDU$ $3333$是一样的,$HDU$ $3333$要求计算区间内不同的数字有几个. 这题稍微变了一下,相当于原来扫描到$i$的之后是更新$a[i ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
- HDU 5869 Different GCD Subarray Query(2016大连网络赛 B 树状数组+技巧)
还是想不到,真的觉得难,思路太巧妙 题意:给你一串数和一些区间,对于每个区间求出区间内每段连续值的不同gcd个数(该区间任一点可做起点,此点及之后的点都可做终点) 首先我们可以知道每次添加一个值时gc ...
- HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)
树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/6 ...
随机推荐
- 20155217《网络对抗》Exp08 Web基础
20155217<网络对抗>Exp08 Web基础 实践内容 Web前端:HTML基础 Web前端:javascipt基础 Web后端:MySQL基础 Web后端:PHP基础 SQL注入 ...
- RocEDU.课程设计2018 第二周进展 博客补交
本周计划完成的任务 (1).将开发板和平板电脑及其相关配件连通,并和电脑连接. (2).将代码的运行设备从安卓模拟器改为试验箱的平板电脑,平板电脑上实现软件. 本周实际完成情况 (1).计划完成的第一 ...
- [Deep-Learning-with-Python]计算机视觉中的深度学习
包括: 理解卷积神经网络 使用数据增强缓解过拟合 使用预训练卷积网络做特征提取 微调预训练网络模型 可视化卷积网络学习结果以及分类决策过程 介绍卷积神经网络,convnets,深度学习在计算机视觉方面 ...
- Hadoop日记Day6---Linux的常用命令
一.系统操作(开机.关机.登陆等)命令 选项名称 使用格式 含义 reboot 输入回车即可 立刻重启 shutdown shutdown –r now 立刻重启 shutdown –r 20: ...
- 06-Git-Linux命令
Git 命令 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一.新建代码库 # 新建一个目录,将其初始化为Git代 ...
- CF 24 D. Broken robot
D. Broken robot 链接. 题意: 一个方格,从(x,y)出发,等价的概率向下,向左,向右,不动.如果在左右边缘上,那么等价的概率不动,向右/左,向下.走到最后一行即结束.求期望结束的步数 ...
- [CF1038F]Wrap Around[AC自动机+dp]
题意 题目链接 分析 题意容易转化成求循环之后不包含 \(s\) 的串的个数. 首先建立 AC 自动机.考虑一个暴力的做法:枚举长度为 \(n\) 的字符串 \(t\) 最终(后缀) 和 \(s\) ...
- MOSFET的小信号模型和频率响应
这部分内容大部分参考W.Y.Choi的课堂讲义第三讲和第四讲:http://tera.yonsei.ac.kr/class/2007_1/main.htm 一.小信号模型 首先要明确一点,大部分情形M ...
- CentOS 6.8 安装Maven
1.下载maven安装包到developer文件目录下 2,解压缩maven,命令: -bin.tar.gz 3.配置maven路径到环境变量中 export JAVA_HOME=/usr/java/ ...
- 阿里(蚂蚁,菜鸟)+百度+网易面经(JAVA)
本人综述: 本人本科和硕士均是毕业于普通的双非院校,参加过ACM竞赛,阿里面了三次全被拒了,网易收到offer. 阿里面试: 阿里的面试问的都是很基础的东西,如操作系统的简单问题,计算机网络的基本问题 ...