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比较,然后 ...
随机推荐
- SQLServer学习笔记<>日期和时间数据的处理(cast转化格式、日期截取、日期的加减)和 case表达式
日期和时间数据的处理. (1)字符串日期 ‘20080301’,这一串为字符串日期,但必须保证为四位的年份,两位的月份,两位的日期.例如,查询订单表日期大于‘20080301’.可以这样写: 1 se ...
- python正则表达式之元字符介绍
python中元字符及其含义如下: 元字符 含义 . 匹配除换行符以外的任意一个字符 ^ 匹配行首 $ 匹配行尾 ? 重复匹配0次或1次 * 重复匹配0次或更多次 + 重复匹配1次或更多次 {n,} ...
- ACM题目————列变位法解密
这是在百度之星看到的. Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐 ...
- HDU 4709:Herding
Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 在Windows Live Writer中插入C# code
平时都是用Windows Live Writer写博客,发布博客.遇到需要插入代码都是先在notepad中写好,或者是拷贝到notepad,再从notepad中拷到Windows Live Write ...
- WCF自定义地址路由映射(不用svc文件)
一般在创建WCF服务时会用Serivce.svc文件访问,地址如:http://localhost/applicationname/Serivce.svc/Name 现在用路由映射成:http://l ...
- 20150626_Andriod_02_ListView2_列表与详细信息
android listview 参考地址: http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html http://xy ...
- (原创)cocos2dx使用jsoncpp的正确姿势
环境: vs2010, cocos2dx@2.1.4, win32, jsoncpp-src-0.5.0.tar.gz jsoncpp下载地址: http://sourceforge.net/proj ...
- 算法大全(c,c++)
http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...
- 最长递增子序列LIS再谈
DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...