【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

对于1操作
令len = r-l+1
等价于查找l..r这个范围内**x的倍数的个数**是否大于等于len-1
也即l..r这个范围内**不是x的倍数的个数**小于等于1个
(因为**如果改的话,肯定是把那个数字改成x**,其他n-1个数**必须是x的倍数**,只有这样gcd才会为x
(**不用改的情况**则**不一定里面就一定有x**,但**肯定都是x的倍数**
(所以我们改的时候,实际上是一个**贪心**的过程,就**强行把那个不是x的倍数的数改成x**
(或者是**虽然都是x的倍数,但gcd比x大,那么就任意把一个数字改成x就好了,gcd肯定就变成x了**
(这样**加上"其他n-1个数字都是x的倍数"**这个限制,**整体的gcd就是x了**

这个可以通过建立线段树来实现。

因为gcd有交换律。

所以合并的时候,只要把左边的gcd和右边的gcd一起求一个gcd就行了。

这样。我们在某个区间内。

设l..mid的gcd为xx

设mid+1..r的gcd为yy

如果gcd(xx,x)!=x 且 gcd(yy,x)!=x

也就是说左右两个子区间的gcd都不是x的倍数。

那么就直接返回无解。

(因为这就表示这两个区间分别有一个数字不是x的倍数,即不是x的倍数的个数>1,所以无解

如果gcd(xx,x)x且gcd(yy,x)x

就说明左右两个区间的gcd都是x的倍数。

那么这两个区间里面的数字肯定都是x的倍数。

也可以直接返回。

否则如果gcd(xx,x)!=x那么就往左区间继续递归。

如果gcd(yy,x)!=x那么就往右区间继续递归。

中间如果发现不是x的倍数的个数超过了1就直接退出

2操作就是线段树的单点更新。

【代码】

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rson m+1,r,rt<<1|1
#define lson l,m,rt<<1
using namespace std;
const int N=5e5+7;
int n,i,j,a[N],tr[N<<2],now,x; void build(int l=1,int r=n,int rt=1)
{
if(l==r){
tr[rt]=a[l];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
tr[rt]=__gcd( tr[rt<<1] , tr[rt<<1|1]);
} void query(int L,int R,int l=1,int r=n,int rt=1)
{
if (now>1) return;
int m=(l+r)>>1;
if(L<=l&&r<=R) {
if (l==r){
if (__gcd(tr[rt],x)!=x) now++;
return;
}
int xx = __gcd(tr[rt<<1],x),yy = __gcd(tr[rt<<1|1],x);
if (xx!=x && yy!=x){
now+=2;
return;
}else if (xx==x && yy==x) return;
if (xx!=x) query(L,R,lson);
if (yy!=x) query(L,R,rson);
return;
}
if (L<=m) query(L,R,lson);
if (m<R) query(L,R,rson);
} void updata(int p,int num,int l = 1,int r = n,int rt = 1){
if (l==r){
a[l] = num;
tr[rt] = a[l];
return;
}
int m = (l+r)>>1;
if (p<=m)
updata(p,num,lson);
else
updata(p,num,rson);
tr[rt]=__gcd( tr[rt<<1] , tr[rt<<1|1]);
} int main()
{
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0); cin >>n;
for (int i = 1;i <= n;i++) cin >>a[i];
build();
int Q;
cin >> Q;
while (Q--){ int ope;
cin >>ope;
if (ope==2){
int i,y;
cin >> i >> y;
updata(i,y);
}else{
int l,r;
cin >> l >> r >> x;
now = 0;
query(l,r);
if (now>1){
cout<<"NO"<<endl;
}else{
cout <<"YES"<<endl;
}
}
}
return 0;
}

【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) D】Bash and a Tough Math Puzzle的更多相关文章

  1. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  2. Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)

    题目链接  Round #458 (Div. 1 + Div. 2, combined)  Problem D 题意  给定一个序列,两种询问:单点修改,询问某个区间能否通过改变最多一个数使得该区间的 ...

  3. Codecraft-18 and Codeforces Round #458:D,Bash and a Tough Math Puzzle

    题目传送门 题目大意:Bash喜欢对数列进行操作.第一种操作是询问l~r区间内的gcd值是否几乎为x,几乎为表示能否至多修改一个数达到.第二种操作是将ai修改为x.总共Q个询问,N个数. Soluti ...

  4. [Codeforces 914D] Bash and a Tough Math Puzzle

    [题目链接] https://codeforces.com/contest/914/problem/D [算法] 显然 , 当一个区间[l , r]中为d倍数的数的个数 <= 1 , 答案为Ye ...

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

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

  6. Codeforces.914D.Bash and a Tough Math Puzzle(线段树)

    题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...

  7. 2018.12.08 codeforces 914D. Bash and a Tough Math Puzzle(线段树)

    传送门 线段树辣鸡题. 题意简述:给出一个序列,支持修改其中一个数,以及在允许自行修改某个数的情况下询问区间[l,r][l,r][l,r]的gcdgcdgcd是否可能等于一个给定的数. 看完题就感觉是 ...

  8. Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)

    大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...

  9. codeforces 914 D Bash and a Tough Math Puzzle

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

随机推荐

  1. php八大设计模式之装饰器模式

    我们都知道,得到一匹布需要大概这么几步: 1.染色 2.印花 3.裁剪 这种形式在面向对象中怎么实现呢? 面向过程[继承模式]实现: 继承模式得到需要的布料,一步一步的加工. 继承的层次越来越深,扩展 ...

  2. centos6.9安装virtualenv并配置python2.7环境

    一. 安装python2.7 解压文件 tar -xvf Python-2.7.14.tar 进入源码包目录 cd Python-2.7.14 开始构建之前指定安装的目录 默认会被安装进 /usr/l ...

  3. bzoj 1088 [SCOI2005] 扫雷

    SCOI2005 扫雷 一道很有趣的(水)题 “这道题有四种解法,你知道么” 给你矩阵的第二列的数字,求出第一列雷有多少种可能的摆法. 不懂扫雷规则的自行按win+R然后输入winmine 思考过后我 ...

  4. Unity ContextMenu特性

    有时候我们需要在编辑器下,频繁的做一些操作,比如说在不同的位置创建物体,一个个的修改坐标显然有点繁琐 这时候ContextMenu就派上用处了 例:利用 LineRenderer 画圆,我们不可能一个 ...

  5. HDFS 文件系统流程图。PB级文件存储时序图。

    大小文件通吃, 热点hash功能. 全局唯一KV索引. 百度网盘模式.断点续传功能.MR分析功能. 来自为知笔记(Wiz)

  6. ArcGIS api for javascript——加载查询结果,单击显示信息窗口

    描述 本例在开始和地图交互前执行一个查询并加载结果.这允许用户点击任意郡县立即看到一个InfoWindow. QueryTask构造函数接受被查询的图层,即ESRI sample server上ESR ...

  7. [Recompose] Create Stream Behaviors to Push Props in React Components with mapPropsStream

    Rather than using Components to push streams into other Components, mapPropsStream allows you to cre ...

  8. Android导航Tab栏实现

    前言 android中滑动控件非常多,相信大部分同学接触的都是ListView这样的竖向滑动的控件,可是有时候我们也有横向滑动的需求,非常多应用眼下也做成了这个样子,以weiciyuan为例,例如以下 ...

  9. STL使用————SET&MULTISET

    SET函数的基本用法 by hhl 使用set的好处 1. 当增加元素后,集合会自动删重并从小到大排列(时间比快排还快)2. 相当于一棵伸展树(能快速求出后继) 使用基础 #include<se ...

  10. 安装vnc出现的问题

    重启vnc 命令:/sbin/service vncserver start或者vncserver VNC的启动/停止/重启 #service vncserver start/stop/restart ...