【刷题】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 ...
随机推荐
- STS-创建spring配置文件
1.创建一个bean文件 2.输入文件名applicationContext.xml 3.这里会自动显示模板文件 4.创建后,自动填充头不定义 到这里就可以发现,我们创建spring文件时,需要的配置 ...
- 查看历史命令 history
生产上有文件被清空了,想查查是谁操作的? 通过history查看历史命令: $history |more 也可以通过文件查看历史命令: $vi ~/.bash_history 只显示历史命令,像查一查 ...
- mysql图形化界面MySQL_Workbench
1,下载最新版本的MySQL Workbench,下载地址: http://www.mysql.com/downloads/workbench/ 2,安装Workbench的依赖组件两个 http ...
- CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...
- Windows Server2003 IIS服务器安全配置整理
一.系统的安装 1.按照Windows2003安装光盘的提示安装,默认情况下2003没有把IIS6.0安装在系统里面.2.IIS6.0的安装 开始菜单—>控制面板—>添加或删除程序—& ...
- mfc Unicode转 ASNI ,WCHAR 转 CHAR
知识点: 宽字符转多字节字符 多字节字符转宽字符 什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit 在VC ...
- RHEL6 最小化系统 编译安装部署zabbix (mysql)
RHEL6 最小化系统 编译安装部署zabbix (mysql)官方说明详细见:https://www.zabbix.com/documentation/4.0/manual/installation ...
- HTML基础语法
目录 HTML基础语法 1.全局架构标签 2.标题 3.段落 4.文本 5.属性 6.链接 7.图片 8.列表 9.表格 10.区块 11.布局 12.表单 13.框架 14.头部 HTML基础语法 ...
- [CF1065F]Up and Down the Tree[树dp]
题意 给定一棵以 \(1\) 为根的树,你每次可以选择跳到某个叶子节点,再跳到和他深度差不超过 \(k\) 的祖先.询问最多能够跳到多少个叶子节点. \(n,k\leq 10^6\) . 分析 最后的 ...
- In-Memory:内存优化表的DMV
SQL Server 在执行查询时,自动将活动的相关信息保存在内存中,这些活动信息称作DMV(Dynamic Management View),DMV记录SQL Server实例级别上的活动信息.由于 ...