Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
题意
给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变一个数的值(注意不是真的改变),使得这个区间的gcd是小明所猜的数也算小明猜对。另一种操作就是真的修改某一点的值。
解题思路
这里我们使用线段树,维护区间内的gcd,判断的时候需要判断这个区间的左右子区间的gcd是不是小明猜的数的倍数或者就是小明猜的数,如果是,那么小明猜对了。否则就需要进入这个区间再进行判断,如果一直递归到叶子节点的话就要使ans++,代表需要改变的点的个数,如果ans大于1就可以直接结束当前层次的查询,因为小明已经猜错了。
具体看query代码
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ls (rt<<1)
#define rs (rt<<1|1)
using namespace std;
const int maxn=5e5+7;
struct node{
int l, r;
int gcd;
}t[maxn<<2];
int num[maxn];
int n, m, ans;
int gcd(int x, int y)
{
if(y==0) return x;
return gcd(y, x%y);
}
void up(int rt)
{
t[rt].gcd=gcd(t[ls].gcd, t[rs].gcd);
}
void build(int rt, int l, int r)
{
t[rt].l=l;
t[rt].r=r;
if(l==r)
{
t[rt].gcd=num[l];
return ;
}
int mid=(l+r)>>1;
build(ls, l, mid);
build(rs, mid+1, r);
up(rt);
}
void update(int rt, int x, int y)
{
if(t[rt].l==t[rt].r)
{
t[rt].gcd=y;
return ;
}
int mid=(t[rt].l+t[rt].r)>>1;
if(x<=mid) update(ls, x, y);
else update(rs, x, y);
up(rt);
}
void query(int rt, int l, int r, int x)
{
if(t[rt].l==t[rt].r)//如果递归到了叶子节点,那么说明如果需要小明猜对,那么这个点的值就需要修改。
{
ans++; //表示需要修改的点的个数。
return ;
}
if(ans > 1) return ; //如果大于1的话就直接返回,不用再进行查询了。
int mid=(t[rt].l+t[rt].r)>>1;
if(l<=mid && t[ls].gcd%x!=0) query(ls, l, r, x);
if(r>mid && t[rs].gcd%x!=0) query(rs, l, r, x);
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
for(int i=1; i<=n; i++)
scanf("%d", &num[i]);
build(1, 1, n);
scanf("%d", &m);
int op, l, r, x, y;
for(int i=1; i<=m; i++)
{
scanf("%d", &op);
if(op==1)
{
scanf("%d%d%d", &l, &r, &x);
ans=0;
query(1, l, r, x);
if(ans>1) printf("NO\n");
else printf("YES\n");
}
else
{
scanf("%d%d", &x, &y);
update(1, x, y);
}
}
}
return 0;
}
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论的更多相关文章
- Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)
大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...
- Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)
题目链接 Round #458 (Div. 1 + Div. 2, combined) Problem D 题意 给定一个序列,两种询问:单点修改,询问某个区间能否通过改变最多一个数使得该区间的 ...
- B - Bash and a Tough Math Puzzle CodeForces - 914D (线段树的巧妙应用)
题目大意:当输入2时,将p处的点的值修改为x, 当输入1时,判断区间[L,R]的gcd是否几乎正确,几乎正确的定义是最多修改一个数,使得区间[L,R]的gcd为x. 题解:用线段树维护一个gcd数组, ...
- CF 914 D. Bash and a Tough Math Puzzle
D. Bash and a Tough Math Puzzle http://codeforces.com/contest/914/problem/D 题意: 单点修改,每次询问一段l~r区间能否去掉 ...
- D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹.數論) 今天我們來看看CF914D 題目連結 題目 給你一個長度為\(n\)的數列\(a\), ...
- [Codeforces 914D] Bash and a Tough Math Puzzle
[题目链接] https://codeforces.com/contest/914/problem/D [算法] 显然 , 当一个区间[l , r]中为d倍数的数的个数 <= 1 , 答案为Ye ...
- Codecraft-18 and Codeforces Round #458:D,Bash and a Tough Math Puzzle
题目传送门 题目大意:Bash喜欢对数列进行操作.第一种操作是询问l~r区间内的gcd值是否几乎为x,几乎为表示能否至多修改一个数达到.第二种操作是将ai修改为x.总共Q个询问,N个数. Soluti ...
- Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD
题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...
- Codeforces.914D.Bash and a Tough Math Puzzle(线段树)
题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...
随机推荐
- bzoj2802 [Poi2012]Warehouse Store 贪心+堆
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2802 题解 我一开始想到了一个比较麻烦的做法. 把每一天按照 \(b_i\) 从小到大排序,\ ...
- selenium定位
https://www.cnblogs.com/programer-xinmu78/p/10881766.html https://www.cnblogs.com/eastonliu/p/908830 ...
- 数据结构--排序--快排and冒泡(python)
听说大厂面试,限时两分钟写出来快排... 闲着没事,写了一下... def Partition(L,low,high): pivotkey = L[low] while low<high: wh ...
- 弹性盒子FlexBox简介(一)
一.理解弹性盒子 弹性盒子是CSS3的一种新的布局模式. CSS3弹性盒子(Flexible Box或flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时,确保元素拥有恰当的行为的布局方 ...
- 浙大PAT CCCC L3-013 非常弹的球 ( 高中物理题 )
题目链接 题意 : 刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不 ...
- 关联规则挖掘--Apriori算法
- 170829-关于AOP面向切面编程
1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学计算器接口[M ...
- [CSP-S模拟测试]:飘雪圣域(莫队)
题目描述 $IcePrincess\text{_}1968$和$IcePrince\text{_}1968$长大了,他们开始协助国王$IceKing\text{_}1968$管理国内事物. $IceP ...
- TensorFlow 源码编译安装
## Install prerequisites (rhel) yum install numpy python-devel python-wheel python-mock ## Install B ...
- codeforces 704B - Ant Man [想法题]
题目链接:http://codeforces.com/problemset/problem/704/B ------------------------------------------------ ...