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

统计不同的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. 关于ADO.NET@SQL Server&SqlDataReader

    先说基础的,说基础的明白了再深的也是一样的.SQL是关系型数据库,所以就决定了对其操作的时候ADO的一些类要相互联系,Connection 类Command对象(ExecuteReader()方法.E ...

  2. jquery与服务器交换数据的利器--ajax(异步javascript and xml)

    load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 一.下面的例子把 "demo_test.txt" 文件中 id="p1" 的元素的内容,加载 ...

  3. [HTML]background-size可以缩放大小

    转自:http://www.igooda.cn/jsdt/20130827355.html background-size需要两个值,它的类型可以是像素(px).百分比(%)或是auto,还可以是co ...

  4. B类地址

    从 128.0.0.0 到 191.255.255.254 的单址广播 IP 地址.前两个八位字节指明网络,后两个八位字节指明网络上的主机.B类地址范围:128.0.0.1到191.255.255.2 ...

  5. Parencodings 分类: POJ 2015-06-28 22:00 7人阅读 评论(0) 收藏

    Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22757   Accepted: 13337 De ...

  6. C#常用日期格式处理转换[C#日期格式转换大全

    DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2.Text = dt.ToFile ...

  7. Unity安卓上播放视频的问题,暂时无解记录一下

    设备联想A7600m,好像是联发科的cpu 先用网上流传很广的这个Unity自带接口试验一下: Handheld.PlayFullScreenMovie(Path.Combine(Applicatio ...

  8. Poj(2253),Dijkstra松弛条件的变形

    题目链接:http://poj.org/problem?id=2253 题意: 给出两只青蛙的坐标A.B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的.显然从A到B存在至少一条的通路,每一条通 ...

  9. easyui.combotree.search.js

    (function ($) { //combotree可编辑,自定义模糊查询 $.fn.combotree.defaults.editable = true; $.extend($.fn.combot ...

  10. Java获取某月天数

    Java获取某月天数 Calendar   cal   =   new   GregorianCalendar(); //或者用Calendar   cal   =   Calendar.getIns ...