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

【题意】

在这里输入题意

【题解】

对于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. TP5 安装

    一.官方手册: https://www.kancloud.cn/manual/thinkphp5/118003 二.Git 方式安装[最新框架下载方式] 首先克隆下载应用项目仓库 git clone ...

  2. BZOJ 2724 [Violet 6]蒲公英(分块)

    题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...

  3. [洛谷P2085]最小函数值

    题目大意:有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,要求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...

  4. python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句

    我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...

  5. thinkphp5项目--企业单车网站(三)

    thinkphp5项目--企业单车网站(三) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...

  6. POJ 2436 二进制枚举

    题意: 思路: 拆成二进制枚举 有哪个病毒在 判一判 就好了 //By SiriusRen #include <cstdio> #include <cstring> #incl ...

  7. OpenSUSE下支持托盘的邮件客户端Sylpheed

    在网上搜索了很多客户端想支持系统托盘,发现一个很不错的邮件客户端Sylpheed.设置方式和foxmail很像,最为重要的是支持系统托盘,很方便,默认没有开启,简单设置下:配置->通用首选项-& ...

  8. MySQL Pool

    创建连接池 function SqlPool() { this.flag = true;//是否连接过 this.pool = mysql.createPool({ host : 'localhost ...

  9. 【Django】Web框架本质

    目录 根据不同的路径返回不同的内容 普通版 函数版 函数进阶版 返回具体的HTML文件 让网页动态起来 服务器和应用程序 wsgiref 模块 @ * 我们可以这样理解:所有的==Web应用本质上就是 ...

  10. modelForm所遇问题

    1. 通过modelForm创建表单所遇问题 id 在modelForm中无法创建使用 因为它是django的设置,自增的字段,而不是模型中所设置的字段. 当关联外键时,创建多选的下拉框时,需要注意此 ...