【CF-Round-458:D】Bash and a Tough Math Puzzle(判断是否可以通过修改区间内的一个数使区间gcd=x)
题目地址: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)相关推荐
- 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 ...
- 【Codeforces Round #458 D.Bash and a Tough Math Puzzl】线段树
链接 Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) 题意 给你一个区间,要支持两种区间操作. 第一种操作是单点更 ...
- Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD
题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...
- cf914D. Bash and a Tough Math Puzzle(线段树)
题意 题目链接 Sol 直接在线段树上二分 当左右儿子中的一个不是\(x\)的倍数就继续递归 由于最多递归到一个叶子节点,所以复杂度是对的 开始时在纠结如果一段区间全是\(x\)的两倍是不是需要特判, ...
- 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 题解:区间询问,单点需 ...
- 【codeforces】【比赛题解】#915 Educational CF Round 36
虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Education ...
- 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)
cf的比赛越来越有难度了--至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积. 保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这 ...
- 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛-- 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
最新文章
- 找出存在性能问题的sql语句
- android 全局 socket,学习Android socket通信之如何解决中文乱码
- 智能卡电子钱包应用密钥体系
- Servlet与缓存
- leetcode 877. 石子游戏(dp)
- 【Oracle经典】132个oracle热门精品资料——下载目录收藏 (转载)
- 鸿蒙应用开发--应用生命周期
- ON DELETE CASCADE和ON UPDATE CASCADE
- 大数据开发笔记(九):Flink综合学习
- 常见linux服务器存储空间,全面了解linux服务器的常用命令总结
- 4.创建并调用自动控制器(api)
- 2022年最新山西机动车签字授权人模拟试题及答案
- 在页面超链接a前加上图标
- 我的Android进阶之旅------Android中编解码学习笔记
- 软件测试邻居集成,软件测试之集成测试(ppt-3).ppt
- vue:无法加载文件..
- PicPick截图神器使用体验
- Python-苹果手机编程
- LVOOP(二)、面向对象概念演示
- 流浪的阿猫阿狗我要怎么帮助你?
热门文章
- ActionScript 中的字符串替换函数
- mysql导出数据库方法_mysql导出数据库几种方法
- 新手引导 自定义遮罩 点击穿透
- 快速查找Unity中的死循环
- html中渐变怎么写,css3如何实现文字渐变?
- C语言程序书写中 每行必须有分号,石家庄铁道大学C语言程序设计习题集.pdf
- Java—读取指定路径下文件的内容
- 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)
- CentOS 7.4 安装Nginx
- 由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结