HDU5869树状数组+gcd预处理
比赛的时候知道用树状数组,但有点乱不知道怎么处理。
统计不同的gcd的个数其实就是用树状数组统计区间内不同的数的模板题啊...
复杂度O(nlogn)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+;
int n,q,i,j,a[N],l[N],v[N];
int fun(int x,int y){return __gcd(x,y);} struct p{
int l, r, ans, k;
};
p query[N];
bool cmp1(const p& a, const p& b){
return a.r < b.r;
}
bool cmp2(const p& a, const p& b){
return a.k < b.k;
} int c[N], last[N*], maxn;
int lowbit(int x){ return x&-x;}
void add(int x, int d){
for(int i = x; i <= n; i += lowbit(i))
c[i] += d;
}
int sum(int x){
int ret = ;
while(x){
ret += c[x];
x -= lowbit(x);
}
return ret;
} int main(){
while(~scanf("%d%d", &n, &q)){
maxn = -;
for(i = ; i <= n; i++) scanf("%d", a+i), maxn = max(maxn, a[i]);
for(i = ; i <= q; i++){
scanf("%d%d", &query[i].l, &query[i].r);
query[i].k = i;
}
sort(query+, query+q+, cmp1);
memset(last, , sizeof(int)*(maxn+));
memset(c, , sizeof(int)*(n+)); int qq = ;
for(i = ; i <= n; i++){
for(v[i] = a[i], j = l[i] = i; j; j = l[j]-){
v[j] = fun(v[j], a[i]);
while(l[j] > &&fun(a[i], v[l[j]-]) == fun(a[i], v[j])) l[j] = l[l[j]-];
//[l[j]..j,i]区间内的值求fun均为v[j]
if(last[ v[j] ]){
if(last[ v[j] ] < j){
add(last[ v[j] ], -);
add(j, );
last[ v[j] ] = j;
}
}
else{//v[j] 没有
add(j, );
last[ v[j] ] = j;
}
}
while(qq <= q&&query[qq].r == i){
query[qq].ans = sum(query[qq].r) - sum(query[qq].l-);
qq++;
}
}
sort(query+, query+q+, cmp2);
for(int i = ; i <= q; i++)
printf("%d\n", query[i].ans);
}
}
HDU5869树状数组+gcd预处理的更多相关文章
- 树状数组 gcd 查询 Different GCD Subarray Query
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)
query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...
- 树状数组 Binary Indexed Tree/Fenwick Tree
2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- 康拓展开 & 逆康拓展开 知识总结(树状数组优化)
康拓展开 : 康拓展开,难道他是要飞翔吗?哈哈,当然不是了,康拓具体是哪位大叔,我也不清楚,重要的是 我们需要用到它后面的展开,提到展开,与数学相关的,肯定是一个式子或者一个数进行分解,即 展开. 到 ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- FZU2224 An exciting GCD problem 区间gcd预处理+树状数组
分析:(别人写的) 对于所有(l, r)区间,固定右区间,所有(li, r)一共最多只会有log个不同的gcd值, 可以nlogn预处理出所有不同的gcd区间,这样区间是nlogn个,然后对于询问离线 ...
- HDU 5869 Different GCD Subarray Query 离线+树状数组
Different GCD Subarray Query Problem Description This is a simple problem. The teacher gives Bob a ...
- 区间gcd问题 HDU 5869 离线+树状数组
题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[] 思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后 ...
随机推荐
- C#:DataTable内容转换为String(XML)
//DataTable转String方法 public static String DataTable2String(DataTable dt) { string strXML = "< ...
- Git and GitHub
1.GitHub 创建一个仓库 2.进入本地要管理的某个文件夹下,感觉目录的操作命令和linux里面差不多, $git init 此时该文件下就会多出一个.git的文件 3.进入要上传的仓库,右键gi ...
- Http Basic认证
Http Basic认证就是访问的时候把用户名和密码用base64加密放在request的header的authorization中 服务端直接获取authorization,解析,跟用户名匹配即可. ...
- Linux hrtimer分析(2)
http://blog.csdn.net/angle_birds/article/details/17375901 本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时 ...
- CPU和GPU实现julia
CPU和GPU实现julia 主要目的是通过对比,学习研究如何编写CUDA程序.julia的算法还是有一定难度的,但不是重点.由于GPU实现了也是做图像识别程序,所以缺省的就是和O ...
- 算法大全(c,c++)
http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
- bnu A Matrix 北京邀请赛A题
A Matrix Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class n ...
- 2016年12月7日 星期三 --出埃及记 Exodus 21:2
2016年12月7日 星期三 --出埃及记 Exodus 21:2 "If you buy a Hebrew servant, he is to serve you for six year ...
- ios kaifa
弹窗提示 { ////ios 7 弹窗 // UIAlertView *alert1=[[UIAlertView alloc] // initWithTitle:@"tishi" ...