Bash and a Tough Math Puzzle 线段树维护区间gcd

还是一道很不错的题目,很容易想到用一棵线段树来维护区间gcd

注意用倍数来剪枝就好了,很是一到很好的题目的

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
const int N = 5e5+10;
int n,q;
struct Segment{
	int l,r;
	int d;
}tr[N<<2];

int w[N];
int res;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}

void pushup(int u){
	tr[u].d = gcd(tr[u<<1].d,tr[u<<1|1].d);
}

void build(int u,int l,int r){
	tr[u] = {l,r};
	if(l==r){tr[u].d = w[l];return;}
	int mid = l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}

void modify(int u,int x,int c){
	if(tr[u].l==tr[u].r&&tr[u].l==x){
		tr[u].d = c;return; 
	}
	
	int mid = (tr[u].l+tr[u].r)>>1;
	if(x<=mid)modify(u<<1,x,c);
	else modify(u<<1|1,x,c);
	pushup(u);
}

void query(int u,int l,int r,int x){
	
	if(res>1)return;
	if(l<=tr[u].l&&tr[u].r<=r){
		if(tr[u].d%x==0)return;
	}
	if(tr[u].l==tr[u].r){
		res+=(tr[u].d%x!=0);
		return;
	}
	
	int mid = tr[u].l+tr[u].r>>1;
	if(l<=mid)query(u<<1,l,r,x);
	if(r>mid)query(u<<1|1,l,r,x);
	
	
}


int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>w[i];
	cin>>q;
	build(1,1,n);
	while(q--){
		int op;cin>>op;
		if(op==1){
			int l,r,x;cin>>l>>r>>x;
			res = 0;
			query(1,l,r,x);
			if(res>1)cout<<"NO"<<"\n";
			else cout<<"YES\n";
			
		}else{
			int x,c;cin>>x>>c;
			modify(1,x,c);
		}
	}
}
相关推荐
June`3 分钟前
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
c++·算法·深度优先·剪枝
vlln10 分钟前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
来自星星的坤31 分钟前
深入理解 NumPy:Python 科学计算的基石
开发语言·python·numpy
小声读源码1 小时前
【技巧】使用UV创建python项目的开发环境
开发语言·python·uv·dify
yxc_inspire1 小时前
基于Qt的app开发第七天
开发语言·c++·qt·app
zm-v-159304339861 小时前
解锁遥感数据密码:DeepSeek、Python 与 OpenCV 的协同之力
开发语言·python·opencv
冲帕Chompa1 小时前
图论part09dijkstra算法
算法·图论
·云扬·1 小时前
【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
redis·算法·lua
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
zkmall1 小时前
推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略
算法·机器学习·推荐算法