比赛的时候知道用树状数组,但有点乱不知道怎么处理。

统计不同的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预处理的更多相关文章

  1. 树状数组 gcd 查询 Different GCD Subarray Query

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  2. 计蒜客 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 ...

  3. 树状数组 Binary Indexed Tree/Fenwick Tree

    2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...

  4. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  5. 康拓展开 & 逆康拓展开 知识总结(树状数组优化)

    康拓展开 : 康拓展开,难道他是要飞翔吗?哈哈,当然不是了,康拓具体是哪位大叔,我也不清楚,重要的是 我们需要用到它后面的展开,提到展开,与数学相关的,肯定是一个式子或者一个数进行分解,即 展开. 到 ...

  6. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  7. FZU2224 An exciting GCD problem 区间gcd预处理+树状数组

    分析:(别人写的) 对于所有(l, r)区间,固定右区间,所有(li, r)一共最多只会有log个不同的gcd值, 可以nlogn预处理出所有不同的gcd区间,这样区间是nlogn个,然后对于询问离线 ...

  8. HDU 5869 Different GCD Subarray Query 离线+树状数组

    Different GCD Subarray Query Problem Description   This is a simple problem. The teacher gives Bob a ...

  9. 区间gcd问题 HDU 5869 离线+树状数组

    题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[] 思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后 ...

随机推荐

  1. YTU 3005: 皇后问题(栈和队列)

    3005: 皇后问题(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 6  解决: 3 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不 ...

  2. HDU(1572),最短路,DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572 很久没写深搜了,有点忘了. #include <iostream> #include ...

  3. 使用main方法调用http请求本地服务器的某个servlet报错问题

    java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8081/test/myS ...

  4. 反射获取类中的属性和set属性

    package framework.base; import java.beans.IntrospectionException; import java.beans.PropertyDescript ...

  5. IOSView翻转扭矩位移

    CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);[xxx setTransform: ...

  6. bmp格式图片文件读取

    C++读取bmp图片 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include &l ...

  7. [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)

    快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...

  8. c++中char*\wchar_t*\string\wstring之间的相互转换

    string U2A(const wstring& str)//Unicode字符转Ascii字符 { string strDes; if ( str.empty() ) goto __end ...

  9. Struts2的异常处理

    Struts2的异常处理 1.异常处理机制(1)发送请求到控制器(Action); (2)Action出现异常后,依照所捕捉的不同异常转入不同的视图资源. 2.异常捕捉 (1)在Action的处理逻辑 ...

  10. 一、spring——helloWorld

    1.添加jar包,如下图所示: 2.建立spring项目,如下图所示: 3.验证,如下图所示: