题目地址:https://codeforces.com/contest/914/problem/D

题目:


给出序列,2种操作:

1 l r x: 判断是否可以通过修改[l,r]区间的一个数使该区间gcd=x,可以输出“YES”,否则“NO”

2 i y:把序列中的第i个值修改为y

解题思路:


首先建立区间gcd对应的线段树,对于第二种操纵,从下往上更新即可。

对于第一种操纵,因为只修改一个数,这个数可以不是x的倍数,若能输出YES,说明这个区间除该数外的其他数都必须是x的倍数,所以可以通过统计该区间内非x倍数的数的数目cnt来判断,若cnt>1则输出NO,否则YES。同时线段树上从上到下进行搜索时,若遇到一个区间的gcd是x的倍数,则无需再继续搜索下去

ac代码:


要慢慢学会写格式规范的代码鸭( ´▽`)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
#define lowbit(x) ((x) & (-x))
int n, q, type, L, R, x, y, pos;
int a[maxn], gd[4*maxn];
int gcd(int a, int b)
{return b == 0 ? a : gcd(b, a % b);
}
void update(int id)
{gd[id] = gcd(gd[id << 1], gd[id << 1 | 1]);
}
void build(int l, int r, int id)
{if(l == r){gd[id] = a[l];return ;}int mid = (l + r) >> 1;build(l, mid, id << 1);build(mid + 1, r,id << 1 | 1);update(id);
}
void change(int l, int r, int id, int pos, int y)
{if(l == r){gd[id] = y;return ;}int mid = (l + r) >> 1;if(pos <= mid) change(l, mid, id << 1, pos, y);else change(mid + 1, r, id << 1 | 1, pos, y);update(id);
}
int  search(int l, int r, int id, int L, int R, int x)
{if(l ==  r)return gd[id] % x !=0;int mid = (l + r) >> 1;int cnt = 0;if((gd[id << 1] % x ) != 0 && L <= mid)//如果gd[id<<1]是x的倍数说明对应区间内的每个数都是x的倍数{cnt += search(l, mid, id << 1, L, R, x);if(cnt > 1) return cnt;//如果查询左半部分区间是cnt的值就已经大于1了,就没必要再查询右半部分了}if((gd[id << 1 | 1] % x) && R > mid){cnt += search(mid + 1, r, id << 1 | 1, L, R, x);if(cnt > 1) return cnt;}return cnt;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt", "r", stdin);//std::ios::sync_with_stdio(false);scanf("%d", &n);for(int i = 1; i <= n; i++)scanf("%d", &a[i]);build(1, n, 1);scanf("%d", &q);for(int i = 1; i <= q; i++){scanf("%d", &type);if(type==1){scanf("%d %d %d", &L, &R, &x);int num = search(1, n, 1, L, R, x);if(num > 1) printf("NO\n");else printf("YES\n");}else{scanf("%d %d", &pos, &y);change(1, n, 1, pos, y);}}return 0;
}

【参考博客】:

https://blog.csdn.net/Link_Ray/article/details/89293465

【CF-Round-458:D】Bash and a Tough Math Puzzle(判断是否可以通过修改区间内的一个数使区间gcd=x)相关推荐

  1. Codecraft-18 and Codeforces Round #458: D. Bash and a Tough Math Puzzle(线段树)

    D. Bash and a Tough Math Puzzle time limit per test 2.5 seconds memory limit per test 256 megabytes ...

  2. 【Codeforces Round #458 D.Bash and a Tough Math Puzzl】线段树

    链接 Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) 题意 给你一个区间,要支持两种区间操作. 第一种操作是单点更 ...

  3. Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

    题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...

  4. cf914D. Bash and a Tough Math Puzzle(线段树)

    题意 题目链接 Sol 直接在线段树上二分 当左右儿子中的一个不是\(x\)的倍数就继续递归 由于最多递归到一个叶子节点,所以复杂度是对的 开始时在纠结如果一段区间全是\(x\)的两倍是不是需要特判, ...

  5. Codeforces914D Bash and a Tough Math Puzzle

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

  6. 【codeforces】【比赛题解】#915 Educational CF Round 36

    虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Education ...

  7. 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

    cf的比赛越来越有难度了--至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...

  8. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积. 保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这 ...

  9. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  10. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛-- 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

最新文章

  1. 找出存在性能问题的sql语句
  2. android 全局 socket,学习Android socket通信之如何解决中文乱码
  3. 智能卡电子钱包应用密钥体系
  4. Servlet与缓存
  5. leetcode 877. 石子游戏(dp)
  6. 【Oracle经典】132个oracle热门精品资料——下载目录收藏 (转载)
  7. 鸿蒙应用开发--应用生命周期
  8. ON DELETE CASCADE和ON UPDATE CASCADE
  9. 大数据开发笔记(九):Flink综合学习
  10. 常见linux服务器存储空间,全面了解linux服务器的常用命令总结
  11. 4.创建并调用自动控制器(api)
  12. 2022年最新山西机动车签字授权人模拟试题及答案
  13. 在页面超链接a前加上图标
  14. 我的Android进阶之旅------Android中编解码学习笔记
  15. 软件测试邻居集成,软件测试之集成测试(ppt-3).ppt
  16. vue:无法加载文件..
  17. PicPick截图神器使用体验
  18. Python-苹果手机编程
  19. LVOOP(二)、面向对象概念演示
  20. 流浪的阿猫阿狗我要怎么帮助你?

热门文章

  1. ActionScript 中的字符串替换函数
  2. mysql导出数据库方法_mysql导出数据库几种方法
  3. 新手引导 自定义遮罩 点击穿透
  4. 快速查找Unity中的死循环
  5. html中渐变怎么写,css3如何实现文字渐变?
  6. C语言程序书写中 每行必须有分号,石家庄铁道大学C语言程序设计习题集.pdf
  7. Java—读取指定路径下文件的内容
  8. 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)
  9. CentOS 7.4 安装Nginx
  10. 由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结