题目链接:https://codeforces.com/gym/101991/problem/G

题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间。

题解:类似HDU 5726,可以先看一下这个blog:https://blog.csdn.net/u013569304/article/details/51987053

考虑离线,先预处理出[ 1,n ]之间所有的GCD,同时需要记录每种 GCD 的区间,方法是固定一个右端点R,对于区间[ L,R ],假设 GCD(L,R)= D,可以找到使得GCD(L,R)突变的点 pos,即 x ∈ [ L,pos ] 都有 GCD(x,R) = D,然后利用线段树可以统计出 GCD = D 的区间个数。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define ull unsigned long long
  5 #define mst(a,b) memset((a),(b),sizeof(a))
  6 #define mp(a,b) make_pair(a,b)
  7 #define pi acos(-1)
  8 #define pii pair<int,int>
  9 #define pb push_back
 10 const int INF = 0x3f3f3f3f;
 11 const double eps = 1e-6;
 12 const int maxn = 1e5 + 10;
 13 const int maxm = 1e6 + 10;
 14 const ll mod =  1e9 + 7;
 15
 16 int a[maxn];
 17
 18 struct node {
 19     int l,r,id;
 20 };
 21
 22 bool cmp(node x,node y) {
 23     if(x.id != y.id) return x.id < y.id;
 24     return x.l > y.l;
 25 }
 26
 27 vector<node>vec[maxm];
 28 vector<pii>now,nex;
 29
 30 ll sum[maxn<<2],ans[maxn];
 31 int lazy[maxn<<2];
 32
 33 inline void init(int rt,int l,int r) {
 34     if(!sum[rt] && !lazy[rt]) return ;
 35     sum[rt] = lazy[rt] = 0;
 36     if(l == r) return ;
 37     int mid = (l + r) >> 1;
 38     init(rt<<1,l,mid);
 39     init(rt<<1|1,mid + 1,r);
 40 }
 41
 42 inline void pushdown(int rt,int l,int r) {
 43     if(lazy[rt]) {
 44         int mid = (l + r) >> 1;
 45         lazy[rt<<1] += lazy[rt];
 46         lazy[rt<<1|1] += lazy[rt];
 47         sum[rt<<1] += 1ll * (mid - l + 1) * lazy[rt];
 48         sum[rt<<1|1] += 1ll * (r - mid) * lazy[rt];
 49         lazy[rt] = 0;
 50     }
 51 }
 52
 53 inline void update(int rt,int l,int r,int ql,int qr) {
 54     if(ql <= l && qr >= r) {
 55         lazy[rt]++;
 56         sum[rt] += (ll)(r - l + 1);
 57         return ;
 58     }
 59     pushdown(rt,l,r);
 60     int mid = (l + r) >> 1;
 61     if(qr <= mid) update(rt<<1,l,mid,ql,qr);
 62     else if(ql > mid) update(rt<<1|1,mid + 1,r,ql,qr);
 63     else {
 64         update(rt<<1,l,mid,ql,mid);
 65         update(rt<<1|1,mid + 1,r,mid + 1,qr);
 66     }
 67     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
 68 }
 69
 70 inline ll query(int rt,int l,int r,int ql,int qr) {
 71     if(ql <= l && qr >= r) return sum[rt];
 72     pushdown(rt,l,r);
 73     int mid = (l + r) >> 1;
 74     if(qr <= mid) return query(rt<<1,l,mid,ql,qr);
 75     else if(ql > mid) return query(rt<<1|1,mid + 1,r,ql,qr);
 76     else return query(rt<<1,l,mid,ql,mid) + query(rt<<1|1,mid + 1,r,mid + 1,qr);
 77 }
 78
 79 int main() {
 80 #ifdef local
 81     freopen("data.txt", "r", stdin);
 82 //    freopen("data.txt", "w", stdout);
 83 #else
 84     freopen("gcdrng.in", "r", stdin);
 85 #endif
 86     int t;
 87     scanf("%d",&t);
 88     while(t--) {
 89         int n,q;
 90         scanf("%d%d",&n,&q);
 91         for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
 92         for(int i = 1; i <= q; i++) {
 93             int l,r,d;
 94             scanf("%d%d%d",&l,&r,&d);
 95             vec[d].push_back({-i,l,r});
 96         }
 97         nex.clear();
 98         for(int i = 1; i <= n; i++) {
 99             now.clear();
100             now.push_back(mp(a[i],1));
101             for(int j = 0; j < nex.size(); j++) {
102                 pii p = nex[j];
103                 int g = __gcd(now[now.size() - 1].first,p.first);
104                 if(g == now[now.size() - 1].first) now[now.size() - 1].second += p.second;
105                 else now.push_back(mp(g,p.second));
106             }
107             int r = i;
108             for(int j = 0; j < now.size(); j++) {
109                 pii p = now[j];
110                 vec[p.first].push_back({r - p.second + 1,r,i});
111                 r -= p.second;
112             }
113             nex = now;
114         }
115         for(int i = 1; i <= 1e6; i++) {
116             init(1,1,n);
117             sort(vec[i].begin(),vec[i].end(),cmp);
118             for(int j = 0; j < vec[i].size(); j++) {
119                 node p = vec[i][j];
120                 if(p.l > 0) update(1,1,n,p.l,p.r);
121                 else ans[-p.l] = query(1,1,n,p.r,p.id);
122             }
123             vec[i].clear();
124         }
125         for(int i = 1; i <= q; i++) printf("%lld\n",ans[i]);
126     }
127     return 0;
128 }

转载于:https://www.cnblogs.com/scaulok/p/10089809.html

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)相关推荐

  1. 2018 Arab Collegiate Programming Contest (ACPC 2018) L.Looking for Taste(按位或)

    题目 n个数选k个,使它们的或最大 n<=1e5 k>=20 ai<=1e6 题解 从高向低位或, 每个数至少产生一位的贡献,所以最多20个数 贪心地使或的数最大即可 由于或没有副作 ...

  2. 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机

    E - Exciting Menus 建个AC自动机求个fail指针就好啦. #include<bits/stdc++.h> #define LL long long #define fi ...

  3. 2018 Arab Collegiate Programming Contest (ACPC 2018) H - Hawawshi Decryption 数学 + BSGS

    H - Hawawshi Decryption 对于一个给定的生成数列 R[ 0 ] 已知, (R[ i - 1 ] * a + b) % p = R[ i ] (p 是 质数), 求最小的 x 使得 ...

  4. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  5. 2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18))

    2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18)) 题目 A B C D E ...

  6. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28

    赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做.就没看. 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意: ...

  7. The 2018 JUST Collegiate Programming Contest H题 Cube

    小学数学题 #include<cstdio> #include<cmath> using namespace std; unsigned long long area, ans ...

  8. 2018 China Collegiate Programming Contest - Jilin Site F - The Hermit HDU - 6560 思维

    链接Problem - 6560 题意 有n个站点每个站点可以发送完美信号 关于完美信号的定义 有i j k三个站点 分别保证 i<j<k dis(i,j)> dis(j,k) 并且 ...

  9. 2018 German Collegiate Programming Contest (GCPC 18) M - Mountaineers(启发式合并)

    题目链接:https://codeforces.com/gym/102021/attachments 题意:现在有个地图由n∗mn*mn∗m个方格组成,每个方格上有个数字,代表在这个点的海拔高度,现在 ...

最新文章

  1. 西雅图SQL PASS之旅
  2. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
  3. 报告显示:2018年北京人工智能相关产业达1500亿元
  4. 分子生物学之蛋白质与氨基酸
  5. Android Studio 使用小技巧
  6. 前端性能优化—将CSS文件放在顶部
  7. 2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程
  8. Centos7上卸载openJdk安装,安装自己的JDK1.8
  9. 没有lrzsz,怎么传文件到服务器?
  10. android之uniapp调用weex的module
  11. vue:ali 阿里矢量图库 ico
  12. 2021年电工(初级)考试试卷及电工(初级)考试平台
  13. teraterm 执行sql_tera term通过ttl脚本 自动连接服务器
  14. MFC使用自带的MSXML6.dll解析xml(开发环境vc2010)
  15. matlab 求切平面,求二次曲面的切平面的简便方法
  16. 经纬财富:乌海黄金白银暂缓跌势
  17. 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办
  18. 通过开源项目SoundTouch实现类似Tom猫的变声功能
  19. 【线性代数 宋浩】P3行列式的性质
  20. ADI Blackfin DSP处理器-BF533的开发详解31:汉字/ASIC II 字库(含源代码)

热门文章

  1. 把一个字符串13579先变成Array——[1, 3, 5, 7, 9],再利用reduce(),就可以写出一个把字符串转换为Number的函数。
  2. tkinter 利器--------pmw模块,里面有很多造好的轮子,有详细的demo
  3. 东北大学计算机学院领导,计算机学院召开新一届全体干部大会
  4. 谷歌收购眼球追踪技术公司Eyefluence,眼动关注度将成为VR的新视角
  5. prism在java_Prism 框架应用-基础知识篇
  6. python 修改图片尺寸 留白_python等比压缩图片到固定大小,不足的留白
  7. 谷歌浏览器无法下载东西未响应的问题
  8. [200127] Java类初始化与实例初始化 - Thinking in Java学习日志
  9. 银河证券的系统也错的太厉害了吧..
  10. 如何处理u盘一插进电脑就自动打开里面的所有文件夹