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);
		}
	}
}
相关推荐
Kalika0-036 分钟前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch38 分钟前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
代码雕刻家1 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
一个闪现必杀技1 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的1 小时前
[C语言]--编译和链接
c语言·开发语言
sp_fyf_20241 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
XKSYA(小巢校长)2 小时前
NatGo我的世界联机篇
开发语言·php
Cons.W3 小时前
Codeforces Round 975 (Div. 1) C. Tree Pruning
c语言·开发语言·剪枝
我是哈哈hh3 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝