不是哈希,求调
查看原帖
不是哈希,求调
525402
_Hugoi_楼主2024/7/16 20:08

只有1号点WA掉了……

第 199909 行 Yes 判成了 No

翻看了之前能看到的所有提交记录,没有发现和我错的一样的……

同时尝试了讨论区所有hack,都过了。

求调。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,inf=1e18;
int n,m,a[N],pre[N],nxt[N];
struct node{
	int minn,maxx,gcd,pre;
}tr[N<<2];
map<int,set<int> > mp;
void push_up(int u){
	tr[u].minn=min(tr[u<<1].minn,tr[u<<1|1].minn);
	tr[u].maxx=max(tr[u<<1].maxx,tr[u<<1|1].maxx);
	tr[u].gcd=__gcd(tr[u<<1].gcd,tr[u<<1|1].gcd);
	tr[u].pre=max(tr[u<<1].pre,tr[u<<1|1].pre);
}
void build(int l,int r,int u){
	if(l==r){
		tr[u].minn=tr[u].maxx=a[l];
		tr[u].gcd=abs(a[l]-a[l-1]);
		tr[u].pre=pre[l];
		if(l==1) tr[u].gcd=abs(a[2]-a[1]);
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,u<<1);
	build(mid+1,r,u<<1|1);
	push_up(u);
}
void update(int ll,int rr,int l,int r,int x,int y,int u){
	if(ll<=l&&rr>=r){
		tr[u].maxx=tr[u].minn=x;
		tr[u].pre=y;
		tr[u].gcd=abs(a[l]-a[l-1]);
		if(l==1) tr[u].gcd=abs(a[2]-a[1]);
		return ;
	}
	int mid=(l+r)>>1;
	if(ll<=mid) update(ll,rr,l,mid,x,y,u<<1);
	if(rr>mid) update(ll,rr,mid+1,r,x,y,u<<1|1);
	push_up(u);
}
node query(int ll,int rr,int l,int r,int u){
	if(ll<=l&&rr>=r) return tr[u];
	int mid=(l+r)>>1;
	node res={inf,0,0,0},res1={inf,0,0,0},res2={inf,0,0,0};
	if(ll<=mid) res1=query(ll,rr,l,mid,u<<1);
	if(rr>mid) res2=query(ll,rr,mid+1,r,u<<1|1);
	res.minn=min(res1.minn,res2.minn);
	res.maxx=max(res1.maxx,res2.maxx);
	res.pre=max(res1.pre,res2.pre);
	return res;
}
int query1(int ll,int rr,int l,int r,int u){
	if(ll<=l&&rr>=r) return tr[u].gcd;
	int mid=(l+r)>>1,res=0,res1=0,res2=0;
	if(ll<=mid) res1=query1(ll,rr,l,mid,u<<1);
	if(rr>mid) res2=query1(ll,rr,mid+1,r,u<<1|1);
	if(!res1) res=res2;
	else if(!res2) res=res1;
	else res=__gcd(res1,res2);
	return res;
}
signed main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(mp[a[i]].empty()) pre[i]=0;
		else pre[i]=*--mp[a[i]].end();
		nxt[pre[i]]=i;
		mp[a[i]].insert(i);
	}
	build(1,n,1);
	int ans=0;
	while(m--){
		int op,x,y,k;
		cin>>op>>x>>y;
		x^=ans,y^=ans;
		if(op==1){
			mp[a[x]].erase(x);
			mp[y].insert(x);
			a[x]=y;
			if(nxt[x]){
				if(*mp[a[nxt[x]]].begin()==nxt[x]) pre[nxt[x]]=0;
				else pre[nxt[x]]=*--mp[a[nxt[x]]].lower_bound(nxt[x]);
			}
			if(*--mp[a[x]].end()==x) nxt[x]=0;
			else nxt[x]=*mp[a[x]].upper_bound(x),pre[nxt[x]]=x;
			if(pre[x]){
				if(*--mp[a[pre[x]]].end()==pre[x]) nxt[pre[x]]=0;
				else nxt[pre[x]]=*mp[a[pre[x]]].upper_bound(pre[x]);
			}
			if(*mp[a[x]].begin()==x) pre[x]=0;
			else pre[x]=*--mp[a[x]].lower_bound(x),nxt[pre[x]]=x;
			update(x,x,1,n,y,pre[x],1);
			if(x!=n) update(x+1,x+1,1,n,a[x+1],pre[x+1],1);
		}
		else{
			cin>>k;
			k^=ans;
			if(x==y){
				cout<<"Yes"<<'\n';
				ans++;
				continue;
			}
			node res=query(x,y,1,n,1);
			int gcd=query1(x+1,y,1,n,1);
			if(k==0){
				if(res.minn==res.maxx) cout<<"Yes"<<'\n',ans++;
				else cout<<"No"<<'\n';
				continue;
			}
			if(res.maxx!=res.minn+(y-x)*k){
				cout<<"No"<<'\n';
				continue;
			}
			if(gcd!=k){
				cout<<"No"<<'\n';
				continue;
			}
			if(res.pre>=x){
				cout<<"No"<<'\n';
				continue;
			}
			cout<<"Yes"<<'\n';
			ans++;
		}
	}
}
2024/7/16 20:08
加载中...