2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)
题目链接: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)相关推荐
- 2018 Arab Collegiate Programming Contest (ACPC 2018) L.Looking for Taste(按位或)
题目 n个数选k个,使它们的或最大 n<=1e5 k>=20 ai<=1e6 题解 从高向低位或, 每个数至少产生一位的贡献,所以最多20个数 贪心地使或的数最大即可 由于或没有副作 ...
- 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 ...
- 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 使得 ...
- 2018 German Collegiate Programming Contest (GCPC 18)
2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...
- 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 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做.就没看. 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意: ...
- The 2018 JUST Collegiate Programming Contest H题 Cube
小学数学题 #include<cstdio> #include<cmath> using namespace std; unsigned long long area, ans ...
- 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) 并且 ...
- 2018 German Collegiate Programming Contest (GCPC 18) M - Mountaineers(启发式合并)
题目链接:https://codeforces.com/gym/102021/attachments 题意:现在有个地图由n∗mn*mn∗m个方格组成,每个方格上有个数字,代表在这个点的海拔高度,现在 ...
最新文章
- 西雅图SQL PASS之旅
- BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
- 报告显示:2018年北京人工智能相关产业达1500亿元
- 分子生物学之蛋白质与氨基酸
- Android Studio 使用小技巧
- 前端性能优化—将CSS文件放在顶部
- 2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程
- Centos7上卸载openJdk安装,安装自己的JDK1.8
- 没有lrzsz,怎么传文件到服务器?
- android之uniapp调用weex的module
- vue:ali 阿里矢量图库 ico
- 2021年电工(初级)考试试卷及电工(初级)考试平台
- teraterm 执行sql_tera term通过ttl脚本 自动连接服务器
- MFC使用自带的MSXML6.dll解析xml(开发环境vc2010)
- matlab 求切平面,求二次曲面的切平面的简便方法
- 经纬财富:乌海黄金白银暂缓跌势
- 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办
- 通过开源项目SoundTouch实现类似Tom猫的变声功能
- 【线性代数 宋浩】P3行列式的性质
- ADI Blackfin DSP处理器-BF533的开发详解31:汉字/ASIC II 字库(含源代码)
热门文章
- 把一个字符串13579先变成Array——[1, 3, 5, 7, 9],再利用reduce(),就可以写出一个把字符串转换为Number的函数。
- tkinter 利器--------pmw模块,里面有很多造好的轮子,有详细的demo
- 东北大学计算机学院领导,计算机学院召开新一届全体干部大会
- 谷歌收购眼球追踪技术公司Eyefluence,眼动关注度将成为VR的新视角
- prism在java_Prism 框架应用-基础知识篇
- python 修改图片尺寸 留白_python等比压缩图片到固定大小,不足的留白
- 谷歌浏览器无法下载东西未响应的问题
- [200127] Java类初始化与实例初始化 - Thinking in Java学习日志
- 银河证券的系统也错的太厉害了吧..
- 如何处理u盘一插进电脑就自动打开里面的所有文件夹