博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)
阅读量:5290 次
发布时间:2019-06-14

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

题目链接 

题意  给定一个序列,两种询问:单点修改,询问某个区间能否通过改变最多一个数使得该区间的$gcd$值为$val$。

问题转化为询问某个区间里不是val的倍数的数的个数是否不超过$1$。

用线段树实现即可。

#include 
using namespace std;#define rep(i, a, b) for (int i(a); i <= (b); ++i)#define dec(i, a, b) for (int i(a); i >= (b); --i)const int A = 20;int t[1 << A];int n, q, k, actn;inline int query(int i, int l, int r, int L, int R, int val){ if (t[i] % val == 0) return 1; if (i >= n){ if (!--k) return 0; return 1; } int mid = (l + r) >> 1; if (L <= mid){ if (!query(i << 1 , l , mid , L , min(mid, R) , val)) return 0; } if (R > mid){ if (!query(i << 1 | 1, mid + 1, r , max(mid + 1, L), R , val)) return 0; } return 1;}inline void update(int x, int val){ t[x += n] = val; for (; x >>= 1;) t[x] = __gcd(t[x << 1], t[x << 1 | 1]);} int main(){ scanf("%d", &actn); n = 1 << 19; rep(i, 0, actn - 1){ int x; scanf("%d", &x); t[i + n] = x; } dec(i, n - 1, 1) t[i] = __gcd(t[i << 1], t[i << 1 | 1]); scanf("%d", &q); while (q--){ int op; scanf("%d", &op); if (op == 1){ int x, y, z; scanf("%d%d%d", &x, &y, &z); k = 2; puts(query(1, 0, n - 1, x - 1, y - 1, z) ? "YES" : "NO"); } else{ int x, y; scanf("%d%d", &x, &y); update(x - 1, y); } } return 0;}

  

 

转载于:https://www.cnblogs.com/cxhscst2/p/8548698.html

你可能感兴趣的文章
用HttpCombiner来减少js和css的请问次数
查看>>
FUSE-用户空间文件系统
查看>>
将tiff文件转化为jpg文件并保存
查看>>
ubuntu 16.04 开机脚本
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
SQL SERVER 2005中如何获取日期(一个月的最后一日、一年的第一日等等)
查看>>
django 学习笔记(转)
查看>>
控制台程序秒变Windows服务(Topshelf)
查看>>
字节流与字符流的区别详解
查看>>
20141026--娱乐-箱子
查看>>
自定义分页
查看>>
Oracle事务
查看>>
任意输入10个int类型数据,把这10个数据首先按照排序输出,挑出这些数据里面的素数...
查看>>
String类中的equals方法总结(转载)
查看>>
图片问题
查看>>
bash使用规则
查看>>
AVL数
查看>>
第二章练习
查看>>
ajax2.0
查看>>