社区讨论

Hack全过,SubTask0全错,求调(码风良好)

P5278算术天才⑨与等差数列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@md9y2eqm
此快照首次捕获于
2025/07/19 15:46
8 个月前
此快照最后确认于
2025/07/19 16:16
8 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+5;
const int inf=1e18+7;
#define lson (u<<1)
#define rson (u<<1|1)
#define mid ((l+r)>>1)
int a[maxn],d[maxn];
int n,m,cnt;
map<int,set<int>> mp;
int anc[maxn],suc[maxn];
void remove(int x){
	auto &s=mp[a[x]];
	auto it=s.find(x);
	if(it==s.end())return;
	if(it!=s.begin()){
		auto pre=prev(it);
		suc[*pre]=suc[x];
	}
	if(next(it)!=s.end()){
		auto nex=next(it);
		anc[*nex]=anc[x];
	}
	s.erase(it);
	if(s.empty())mp.erase(a[x]);
}
void insert(int x,int y){
	a[x]=y;
	auto &s=mp[y];
	auto it=s.lower_bound(x);
	if(it!=s.end()){
		suc[x]=*it;
		anc[*it]=x;
	}else{
		suc[x]=n+1;
	}
	if(it!=s.begin()){
		auto pre=prev(it);
		anc[x]=*pre;
		suc[*pre]=x;
	}else{
		anc[x]=0;
	}
	s.insert(x);
}
void change(int x,int y){
	if(a[x]==y)return;
	remove(x);
	insert(x,y);
}
struct seg_tree{
	struct treenode{
		int l,r,mx,mn,mxanc;
	}tree[maxn<<2];
	void pushup(int u){
		tree[u].mx=max(tree[lson].mx,tree[rson].mx);
		tree[u].mn=min(tree[lson].mn,tree[rson].mn);
		tree[u].mxanc=max(tree[lson].mxanc,tree[rson].mxanc);
	}
	void build(int u,int l,int r){
		tree[u].l=l,tree[u].r=r;
		if(l==r){
			tree[u].mx=tree[u].mn=a[l];
			tree[u].mxanc=anc[l];
			return;
		}
		build(lson,l,mid);
		build(rson,mid+1,r);
		pushup(u);
	}
	void update(int u,int p,int x){
		int l=tree[u].l,r=tree[u].r;
		if(l>p||r<p)return;
		if(l==r){
			change(p,x);
			tree[u].mxanc=anc[p];
//			cout<<"mxanc:"<<tree[u].mxanc<<endl;
			tree[u].mx=tree[u].mn=x;
//			cout<<l<<' '<<r<<endl;
			return;
		}
		if(p<=mid)update(lson,p,x);
		else update(rson,p,x);
		pushup(u);
	}
	int querymn(int u,int L,int R){
		int l=tree[u].l,r=tree[u].r;
		if(l>R||r<L)return inf;
		if(L<=l&&r<=R)return tree[u].mn;
		return min(querymn(lson,L,R),querymn(rson,L,R));
	}
	int querymx(int u,int L,int R){
		int l=tree[u].l,r=tree[u].r;
		if(l>R||r<L)return -inf;
		if(L<=l&&r<=R)return tree[u].mx;
		return max(querymx(lson,L,R),querymx(rson,L,R));
	}
	int queryanc(int u,int L,int R){
		int l=tree[u].l,r=tree[u].r;
		if(l>R||r<L)return -1;
		if(L<=l&&r<=R)return tree[u].mxanc;
		return max(queryanc(lson,L,R),queryanc(rson,L,R));
	}
}tree_a;
struct segtree{
	struct treenode{
		int l,r;
		int gcd;
	}tree[maxn<<2];
	void pushup(int u){
		tree[u].gcd=__gcd(tree[lson].gcd,tree[rson].gcd);
	}
	void build(int u,int l,int r){
		tree[u].l=l,tree[u].r=r;
		if(l==r){
			tree[u].gcd=d[l];
			return;
		}
		build(lson,l,mid);
		build(rson,mid+1,r);
		pushup(u);
	}
	void update(int u,int p,int x){
		int l=tree[u].l,r=tree[u].r;
		if(l>p||r<p)return;
		if(l==r){
			tree[u].gcd+=x;
			tree[u].gcd=abs(tree[u].gcd);
			return;
		}
		update(lson,p,x);
		update(rson,p,x);
		pushup(u);
	}
	int querygcd(int u,int L,int R){
		int l=tree[u].l,r=tree[u].r;
		if(l>R||r<L)return 0;
		if(L<=l&&r<=R)return tree[u].gcd;
		return __gcd(querygcd(lson,L,R),querygcd(rson,L,R));
	}
}tree_d;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		d[i]=abs(a[i]-a[i-1]);
		insert(i,a[i]);
	}
	tree_a.build(1,1,n);
	tree_d.build(1,1,n);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int x,y;
			cin>>x>>y;
			x^=cnt,y^=cnt;
			int val=a[x],oldsuc=suc[x];
			tree_a.update(1,x,y);
			int newsuc=suc[x];
			tree_a.update(1,oldsuc,a[oldsuc]);
			tree_a.update(1,newsuc,a[newsuc]);
			tree_d.update(1,x,y-val);
			if(x!=n)tree_d.update(1,x+1,val-y);
		}else{
			int l,r,k;
			l^=cnt,r^=cnt,k^=cnt;
			cin>>l>>r>>k;
			if(l==r){
				cout<<"Yes"<<endl;
				cnt++;
				continue;
			}
			int mn=tree_a.querymn(1,l,r);
			int mx=tree_a.querymx(1,l,r);
			int mxanc=tree_a.queryanc(1,l,r);
			int gcd=tree_d.querygcd(1,l+1,r);
//			cout<<mx<<' '<<mn<<' '<<mxanc<<' '<<gcd<<endl;
			if(k==0){
				if(mx==mn&&mxanc<l){
					cout<<"Yes"<<endl;
					cnt++;
				}
				else cout<<"No"<<endl;
				continue;
			}
			if((mx-mn==(r-l)*k)&&mxanc<l&&gcd==k){
				cout<<"Yes"<<endl;
				cnt++;
			}else{
				cout<<"No"<<endl;
			}
		}
//		for(int i=1;i<=n;i++)cout<<anc[i]<<' ';puts("");
//		cout<<tree_a.tree[1].mxanc<<endl;
//		for(int u=1;u<=13;u++){
//			cout<<tree_a.tree[u].l<<' '<<tree_a.tree[u].r<<' '<<tree_a.tree[u].mxanc<<endl;
//		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...