博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces914D Bash and a Tough Math Puzzle
阅读量:4678 次
发布时间:2019-06-09

本文共 1608 字,大约阅读时间需要 5 分钟。

题意:一个长度为n的序列,T个询问,2种询问1 l r x问[l, r]区间内替换一个数能不能使得gcd[l, r] == x,输出yes和no,2 l x序列第l个数替换为x

题解:区间询问,单点需修改,线段树,算出区间有t个数不是x的倍数,t>1输出no

#include 
#define maxn 501000#define INF 0x3f3f3f3ftypedef long long ll;using namespace std;int gcd[maxn*4];void pushup(int x){ gcd[x] = __gcd(gcd[x<<1], gcd[x<<1|1]);}void build(int l,int r,int x){ if(l == r){ scanf("%d", &gcd[x]); return ; } int mid = (l+r)>>1; build(l, mid, x<<1); build(mid+1, r, x<<1|1); pushup(x);}void update(int l,int r,int x,int t, int c){ if(l == r){ gcd[x] = c; return ; } int mid = (l+r)>>1; if(t<=mid) update(l, mid, x<<1, t, c); else update(mid+1, r, x<<1|1, t, c); pushup(x);}int query(int l,int r,int x,int L,int R,int g){ if(l == r){ return gcd[x]%g?1:0; } if(L>=l && R<=r&&gcd[x]%g == 0) return 0; int mid = l+r>>1; if(mid < L) return query(mid+1, r, x<<1|1, L, R, g); else if(mid >= R) return query(l, mid, x<<1, L, R, g); else{ int b1 = query(l, mid, x<<1, L, mid, g); if(b1 >= 2) return 2; int b2 = query(mid+1, r, x<<1|1, mid+1, R, g); return b1+b2; }}int main(){ int n, t, a, l ,r, x; cin>>n; build(1, n, 1); scanf("%d", &t); while(t--){ scanf("%d", &a); if(a == 1){ scanf("%d%d%d", &l, &r, &x); if(query(1, n, 1, l, r, x) <= 1) printf("YES\n"); else printf("NO\n"); } else { scanf("%d%d", &l, &x); update(1, n, 1, l, x); } } return 0;}

 

转载于:https://www.cnblogs.com/Noevon/p/8328548.html

你可能感兴趣的文章
Java中模拟POST上传文件
查看>>
Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
查看>>
时隔2月,我的第二篇
查看>>
[导入]C++ OpenGL底层和C# GUI无缝联合!
查看>>
调试程序Bug-陈棚
查看>>
STM32 寄存器库和固件库
查看>>
第11周表格
查看>>
linux运维云计算课程学习,Linux云计算面试时遇到的问题
查看>>
Abiword对话框资源
查看>>
跟我一起写 Makefile
查看>>
C# uri
查看>>
GPS定位 测试
查看>>
前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
查看>>
探索从 MVC 到 MVVM + Flux 架构模式的转变
查看>>
tornado的异步效果
查看>>
*2.3.2_加入env
查看>>
JS中SetTimeOut和SetInterval方法的区别?
查看>>
Protocol Buffers proto语言语法说明
查看>>
Hibernate双向一对一对象关系模型映射
查看>>
正则表达式(下)
查看>>