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);
		}
	}
}
相关推荐
为了更好的明天而战18 分钟前
Java 中的 ArrayList 和 LinkedList 区别详解(源码级理解)
java·开发语言
JosieBook42 分钟前
【Java编程动手学】Java中的数组与集合
java·开发语言·python
qq_589568101 小时前
element-plus按需自动导入的配置 以及icon图标不显示的问题解决
开发语言·javascript·ecmascript
lsx2024061 小时前
SQLite Select 语句详解
开发语言
Dovis(誓平步青云)1 小时前
基于探索C++特殊容器类型:容器适配器+底层实现原理
开发语言·c++·queue·适配器·stack
R-sz1 小时前
java流式计算 获取全量树形数据,非懒加载树,递归找儿
java·开发语言·windows
随意0232 小时前
Qt 事件
开发语言·qt
Gyoku Mint2 小时前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类
鸥梨菌Honevid2 小时前
Qt自定义控件(1)——QPaintEvent
开发语言·qt
Code季风2 小时前
深入比较 Gin 与 Beego:Go Web 框架的两大选择
开发语言·golang·go·gin·beego