传送门

线段树维护gcdgcdgcd

如何快速判断[l,r][l,r][l,r]是否都是xxx的倍数呢,查询gcdgcdgcd即可

因为gcdgcdgcd是最大公约数,所以修改一个不是xxx倍数变成xxx一定最优秀

递归查询区间[l,r][l,r][l,r]

若当前区间gcdgcdgcd是xxx的倍数,就不用管了,因为后续可以修改一个数为xxx达到要求

若当前区间gcdgcdgcd不是xxx,说明有叶子节点不为xxx的倍数

只要有两个这样的叶子节点就不可能了

所以查找区间内不是xxx倍数的个数即可

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson ls,l,mid
#define rson rs,mid+1,r
const int maxn = 5e5+10;
int v[maxn<<2],cnt=0,a[maxn];
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
void pushup(int rt,int l,int r){ v[rt] = gcd( v[ls],v[rs] ); }
void build(int rt,int l,int r)
{if( l==r ){ v[rt] = a[l]; return; }build(lson); build(rson);pushup(rt,l,r);
}
void update(int rt,int l,int r,int index,int val)
{if( l>index||r<index )   return;if( l==r&&l==index ){ v[rt]=val ;return;}update(lson,index,val); update(rson,index,val);pushup(rt,l,r);
}
void ask(int rt,int l,int r,int L,int R,int val)
{if( l>R||r<L||cnt>1 ) return;if( l>=L&&r<=R ){if( v[rt]%val==0 )    return;//相等,没事了 if( l==r ){ cnt++;return; }//叶子节点,数目加一if( cnt==1&&v[rt]!=val ){ cnt++; return; }}ask(lson,L,R,val); ask(rson,L,R,val);
}
int main()
{int n; scanf("%d",&n);for(int i=1;i<=n;i++)   scanf("%d",&a[i] );int q; scanf("%d",&q); build(1,1,n);while( q-- ){int type,l,r,x; scanf("%d%d%d",&type,&l,&r);if( type==1 ){scanf("%d",&x); cnt = 0; ask(1,1,n,l,r,x);if( cnt>1 )   printf("NO\n"); else  printf("YES\n");}else update(1,1,n,l,r);}
}

D. Bash and a Tough Math Puzzle(区间gcd+思维)相关推荐

  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 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

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

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

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

  4. 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 题解:区间询问,单点需 ...

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

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

  6. HDU5726 线段树求解区间GCD

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  7. 区间gcd (带修) 线段树

    题目链接:https://ac.nowcoder.com/acm/contest/1033/B 再次吐槽CH 区间gcd再加区间修改. 一般求gcd的时候辗转相除法. gcd(x,y)=gcd(x,y ...

  8. POJ - 1651 Multiplication Puzzle (区间dp)

    题目链接:Multiplication Puzzle 定义状态dp[i][j]表示将区间[i, j]全部取完所需要的最小代价,答案就是dp[1][n - 2]. 状态转移方程为:dp[i][j] = ...

  9. POJ 1651 Multiplication Puzzle 区间dp(水

    题目链接:点击打开链 题意: 给定一个数组,每次能够选择内部的一个数 i 消除,获得的价值就是 a[i-1] * a[i] * a[i+1] 问最小价值 思路: dp[l,r] = min( dp[l ...

  10. Luogu T9376 区间GCD

    题目背景 无 题目描述 给定一长度为n的动态序列,请编写一种数据结构,要求支持m次操作,包括查询序列中一闭区间中所有数的GCD,与对一闭区间中所有数加上或减去一个值. 输入输出格式 输入格式: 第1行 ...

最新文章

  1. CentOS7下vsftp配置
  2. 项目管理ppt_「PPT」几近满分的项目管理PPT干货
  3. spring4 整合 mybatis3 配置文件
  4. Winform中实现ZedGraph滚轮缩放后自动重新加载数据
  5. 第四章 Rails 背后的 Ruby
  6. 牛客练习赛 64——错排
  7. 笨办法学 Python · 续 练习 43:SQL 管理
  8. 找礼物(find)(模拟)
  9. 数据结构上机实践第八周项目3-顺序串算法
  10. 博士计算机毕业论文格式,博士毕业论文格式类型要求
  11. ctf中压缩包隐写经验总结
  12. Activiti6.0.0及以上版本集成Activiti Modeler
  13. Mose机器翻译Ubuntu18配置和遇到的问题
  14. bedtools subtract 基因区段取差集
  15. 数据清理、转换、合并、重塑
  16. 任意函数展开为各阶Taylor多项式的matlab程序
  17. 可调速气体采样泵和液体采样泵选型介绍
  18. Jetpack Compose(一):Text
  19. 如何构建智能车联网主动防御体系
  20. FCKeditor相关资料简介

热门文章

  1. 解决eclipse乱码问题
  2. 神经网络图用什么软件做,图神经网络 图像处理
  3. Android 关于IC卡的读写和加密
  4. 常见设计稿字体对应字重font-weight大小
  5. 按键精灵和python功能对比_AutoIt3和按键精灵的功能对比第2/2页
  6. [乐意黎转载]GitHub上整理的一些工具集合
  7. WIN10配置JAVA环境变量
  8. 软件工程 电子书 免费 下载
  9. 《结构方程模型及其应用》学习笔记0504第一、二章
  10. python 百度翻译破解版,亲证可行