有人帮卡常吗 45pts
查看原帖
有人帮卡常吗 45pts
585962
Deamer楼主2025/2/6 11:22
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define pb push_back
const int N=1e5+10,M=1e6+10;
const int INF=1e8;
int n,m,ID,B;
int a[N];
struct Q { int x,k,c; } q[M],b[M],qq[M];
int fa[N],f[N],g[N],col[N],pre[N],p[N],lst[N],s[N];
int Mn[N],Mx[N],it[N];
ll ans;

int limx;
uint64_t PRG_state;
uint64_t get_number()
{
    PRG_state ^= PRG_state << 13;
    PRG_state ^= PRG_state >> 7;
    PRG_state ^= PRG_state << 17;
    return PRG_state;
}
int readW(int l,int r)
{
	return get_number()%(r-l+1)+l;
}

bool cmp(Q a,Q b) { return a.k<b.k; }

bool cmp2(Q a,Q b) {
	if(a.x^b.x) return a.x<b.x; 
	return a.k<b.k; 
}

ll cnt;
int siz[N],mx[N];

inline int find(int x) {
	while(fa[x]!=x) cnt++,x=fa[x];
	return x;
}

inline void merge(int u,int v){
	u=find(u),v=find(v);
	if(u==v) return ;
	if(siz[u]<siz[v]) swap(u,v);
	siz[u]+=siz[v];
	fa[v]=u;
	mx[u]=max(mx[u],mx[v]);
}

int main(){
	//freopen("in.in","r",stdin);
	//freopen("1.out","w",stdout); 
	cin>>n>>m>>ID>>PRG_state>>limx;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		q[i].x=readW(limx, n);
		q[i].k=readW(1,q[i].x);
		q[i].c=readW(0, 1e7);
		//cerr<<q[i].x<<' '<<q[i].k<<" "<<q[i].c<<endl;
	}
	B=sqrt(n)+1;
	int tot=0;
	for(int i=1;i<=m;i++){
		if(q[i].k<=B) b[++tot]=q[i];
	}
	sort(b+1,b+1+tot,cmp);
	for(int i=1;i<=n;i++){
		int x=a[i];
		p[i]=lst[x];
		lst[x]=i;
	}
	int P=0;
	for(int t=1;t<=B;t++){
		for(int i=1;i<=n;i++) g[i]=f[i],fa[i]=i,col[i]=1,s[i]=0,pre[i]=i-1,siz[i]=1,mx[i]=i;
		int be=1;
		for(int i=1;i<=n;i++){
			if(i==1){
				f[i]=1; s[i]=-1;
				continue;
			}
			int delta=g[i-1]-g[i-2]-1,now=i-1;
			while(now && delta>=0){
				int x=now;
				col[x]=0;
				if(!col[x-1]) merge(x-1,x);
				if(!col[x+1]) merge(x,x+1); 
				delta-=s[x];
				now=pre[now];
				if(x==be) be=i;
			}
			s[i]=-delta;
			pre[i]=now;
			int pos=p[i]+1,R=0,L=0,jb;
			if(col[pos]) L=pos;
			else if((jb=mx[find(pos)])<i) L=jb+1;
			if(L){
				if(s[L]==1){
					int x=pre[L];
					s[L]=s[x];
					pre[L]=pre[x];
					col[x]=0;
					if(!col[x-1]) merge(x-1,x);
					if(!col[x+1]) merge(x,x+1);  
					if(x==be) be=L;
				}
				else s[L]--;
			}
			f[i]=-s[be];
		}
		while(P<=m && b[P+1].k<=t){
			P++;
			if(b[P].k==t) ans^=((ll)b[P].c*f[b[P].x]);
		}
	}
	for(int i=1;i<=m;i++){
		if(q[i].k<=B) continue;
		qq[++tot]=q[i];
	}
	sort(qq+1,qq+1+tot,cmp2);
	for(int i=1;i<=tot;i++){
		if(!it[qq[i].x]) it[qq[i].x]=i;
	}
	for(int K=B;K>=0;K--){
		for(int i=1;i<=n;i++) f[i]=-INF,fa[i]=i,col[i]=1,s[i]=0,pre[i]=i-1,Mn[i]=INF,Mx[i]=-INF,siz[i]=1,mx[i]=i;
		int be=1;
		for(int i=1;i<=n;i++){
			if(i==1){
				f[i]=1-K; s[i]=-1; Mn[1]=Mx[1]=1;
				continue;
			}
			int delta=f[i-1]-f[i-2]-1,now=i-1;
			while(now && delta>=0){
				int x=now;
				col[x]=0;
				Mn[i-1]=min(Mn[i-1],Mn[x-1]);
				Mx[i-1]=max(Mx[i-1],Mx[x-1]);
				if(!col[x-1]) merge(x-1,x);
				if(!col[x+1]) merge(x,x+1); 
				delta-=s[x];
				now=pre[now];
				if(x==be) be=i;
			}
			s[i]=-delta;
			pre[i]=now;
			int pos=p[i]+1,R=0,L=0,jb;
			if(col[pos]) L=pos;
			else if((jb=mx[find(pos)])<i) L=jb+1;
			if(L){
				if(s[L]==1){
					int x=pre[L];
					Mn[L-1]=min(Mn[L-1],Mn[x-1]);
				    Mx[L-1]=max(Mx[L-1],Mx[x-1]);
					s[L]=s[x];
					pre[L]=pre[x];
					col[x]=0;
					if(!col[x-1]) merge(x-1,x);
					if(!col[x+1]) merge(x,x+1);  
					if(x==be) be=L;
				}
				else s[L]--;
			}
			f[i]=-s[be]-K;
			Mn[i]=Mn[be-1]; Mx[i]=Mx[be-1];
			Mn[i]++; Mx[i]++;
		}
		//cerr<<"K: "<<K<<endl;
		//for(int i=1;i<=n;i++) cerr<<"I: "<<i<<" "<<f[i]<<" "<<Mn[i]<<" "<<Mx[i]<<endl;
		for(int i=1;i<=n;i++){
			for(int j=it[i];;j++){
				Q u=qq[j];
				if(u.x!=i){
					it[i]=j;
					break;
				}
				if(Mn[i]<=u.k && u.k<=Mx[i]){
					//cerr<<"A: "<<i<<" "<<u.k<<" "<<(ll)(f[i]+u.k*K)<<endl;
					ans^=(ll)u.c*(f[i]+u.k*K);
				}
				else {
					it[i]=j;
					break;
				}
			}
		}
	}
	cerr<<cnt<<endl;
	cerr<<clock()*1.0/CLOCKS_PER_SEC<<endl;
	printf("%lld\n",ans);
	return 0;
} 
2025/2/6 11:22
加载中...