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

统计不同的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. 让ecshop用户登录评价以可择匿名评价

    ECSHOP 默认的程序 是 当用户登录后,对商品商品评价是不是能匿名评价的. 有些店铺设置了只能登录评价,但客户又不想显示自己的账号名称.这时候 这功能 就可以派上用场了 1在 comment.ph ...

  2. ACM题目————中缀表达式转后缀

    题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...

  3. YTU 2295: KMP模式匹配 一(串)

    2295: KMP模式匹配 一(串) 时间限制: 1 Sec  内存限制: 128 MB 提交: 32  解决: 22 题目描述 求子串的next值,用next数组存放,全部输出 输入 输入一个字符串 ...

  4. Windows下Apache+mod_python+Django配置

    Windows下Apache+mod_python+Django配置 Apache 首先要安装Apache,我安装的版本是2.2.*: Python python肯定是要安装的,我安装的版本是2.5的 ...

  5. Javascript中最常用的经典技巧

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...

  6. Poj(3259),SPFA,判负环

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  7. 数据库查询优化器的艺术:原理解析与SQL性能优化

    数据库查询优化器的艺术 作者:李海翔 Oracle公司MySQL全球开发团队.资深专家 简单的浏览了一遍,由于以前没有接触过SQL优化这些知识,读起来还是非常吃力的,不过收获还是很大的. 作者通过对M ...

  8. SharePoint自动化系列——Select-option标签的定位方法总结

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ C#中通过Selenium定位页面上的select-option结构,尝试了以下几种方法,均没有生 ...

  9. 思考之一——PM(Project Manager)

    摘自:http://blog.csdn.net/moreevan/article/details/6697806

  10. 循环,range,continue 和 break

    1.for循环 用户按照顺序循环可迭代对象中的内容, PS:break.continue li = [11,22,33,44] for item in li:     print item 2.enu ...