求助随机输出错误答案
查看原帖
求助随机输出错误答案
394167
Cure_Wing楼主2024/3/30 16:33

求助随机输出错误答案。主要是第一问的原因,后面直接 RE。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
using std::cin;using std::cout;
constexpr int N=300005,M=5000005,p=1e9+7;
int n,q,f[N],op,b,c,d,e,cnt,root,ans,r1,r2,r3,r4,r5,tot;
struct Treap{
	struct A{int ls,rs,siz,val,sum,t1,t2,rd;bool rev;}a[M];
	inline int newnode(int v){
		a[++cnt].val=v;a[cnt].sum=v;a[cnt].t1=-1;a[cnt].siz=1;a[cnt].rd=rand();
		a[cnt].ls=a[cnt].rs=a[cnt].t2=a[cnt].rev=0;return cnt;
	}
	inline int copy(int x){a[++cnt]=a[x];return cnt;}
	inline void pushup(int p){
		a[p].siz=a[a[p].ls].siz+a[a[p].rs].siz+1;
		a[p].sum=((a[a[p].ls].sum+a[a[p].rs].sum)%p+a[p].val)%p;
	}
	inline void pushdown(int p){
		if(a[p].t1==-1&&!a[p].t2&&!a[p].rev) return ;
		if(a[p].ls) a[p].ls=copy(a[p].ls);
		if(a[p].rs) a[p].rs=copy(a[p].rs);
		if(a[p].rev){
			std::swap(a[p].ls,a[p].rs);
			if(a[p].ls) a[a[p].ls].rev^=1;
			if(a[p].rs) a[a[p].rs].rev^=1;a[p].rev=0;
		}
		if(a[p].t1!=-1){
			if(a[p].ls){
				a[a[p].ls].val=a[a[p].ls].t1=a[p].t1;a[a[p].ls].t2=0;
				a[a[p].ls].sum=1ll*a[p].t1*a[a[p].ls].siz%p;
			}
			if(a[p].rs){
				a[a[p].rs].val=a[a[p].rs].t1=a[p].t1;a[a[p].rs].t2=0;
				a[a[p].rs].sum=1ll*a[p].t1*a[a[p].rs].siz%p;
			}
			a[p].t1=-1;
		}
		if(a[p].t2){
			if(a[p].ls){
				a[a[p].ls].val=(a[a[p].ls].val+a[p].t2)%p;a[a[p].ls].t2=(a[a[p].ls].t2+a[p].t2)%p;
				a[a[p].ls].sum=(a[a[p].ls].sum+1ll*a[p].t2*a[a[p].ls].siz%p)%p;
			}
			if(a[p].rs){
				a[a[p].rs].val=(a[a[p].rs].val+a[p].t2)%p;a[a[p].rs].t2=(a[a[p].rs].t2+a[p].t2)%p;
				a[a[p].rs].sum=(a[a[p].rs].sum+1ll*a[p].t2*a[a[p].rs].siz%p)%p;
			}
			a[p].t2=0;
		}
	}
	inline void split(int p,int k,int &x,int &y){
		if(!p){x=y=0;return ;}
		pushdown(p);
		if(k<=a[a[p].ls].siz){y=copy(p);split(a[y].ls,k,x,a[y].ls);pushup(y);}
		else{x=copy(p);split(a[x].rs,k-a[a[x].ls].siz-1,a[x].rs,y);pushup(x);}
	}
	inline int merge(int x,int y){
		if(!x||!y) return x|y;
		if(a[x].rd<a[y].rd){x=copy(x);pushdown(x);a[x].rs=merge(a[x].rs,y);pushup(x);return x;}
		y=copy(y);pushdown(y);a[y].ls=merge(x,a[y].ls);pushup(y);return y;
	}
	inline void cover(int p,int k){
		a[p].val=a[p].t1=k;a[p].t2=0;
		a[p].sum=1ll*a[p].siz*k%p;
	}
	inline void add(int p,int k){
		a[p].val=(a[p].val+k)%p;a[p].t2=(a[p].t2+k)%p;
		a[p].sum=(a[p].sum+1ll*a[p].siz*k%p)%p;
	}
	inline void down(int p){
		//printf("%d,%d\n",cnt,p);
		if(!p) return ;
		pushdown(p);
		if(a[p].ls) down(a[p].ls);
		f[++tot]=a[p].val;
		if(a[p].rs) down(a[p].rs);
	}
}treap;
signed main(){
	freopen("P5586_1.in","r",stdin);
	freopen("P5586.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>q;srand(time(0));
	for(int i=1;i<=n;++i){cin>>f[i];root=treap.merge(root,treap.newnode(f[i]));}
	for(int i=1;i<=q;++i){
		cin>>op>>b>>c;b^=ans;c^=ans;
		if(op==1){
			treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
			cout<<(ans=treap.a[r2].sum)<<'\n';root=treap.merge(r1,treap.merge(r2,r3));
		}
		if(op==2){
			cin>>d;d^=ans;treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
			r2=treap.copy(r2);treap.cover(r2,d);root=treap.merge(r1,treap.merge(r2,r3));
		}
		if(op==3){
			cin>>d;d^=ans;treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
			r2=treap.copy(r2);treap.add(r2,d);root=treap.merge(r1,treap.merge(r2,r3));
		}
		if(op==4){
			bool tag=0;cin>>d>>e;d^=ans;e^=ans;
			if(b>d){tag=1;std::swap(b,d);std::swap(c,e);}
			treap.split(root,e,r1,r5);treap.split(r1,d-1,r1,r4);
			treap.split(r1,c,r1,r3);treap.split(r1,b-1,r1,r2);
			if(tag) root=treap.merge(r1,treap.merge(r4,treap.merge(r3,treap.merge(r4,r5))));
			else root=treap.merge(r1,treap.merge(r2,treap.merge(r3,treap.merge(r2,r5))));
		}
		if(op==5){
			cin>>d>>e;d^=ans;e^=ans;
			if(b>d){std::swap(b,d);std::swap(c,e);}
			treap.split(root,e,r1,r5);treap.split(r1,d-1,r1,r4);
			treap.split(r1,c,r1,r3);treap.split(r1,b-1,r1,r2);
			root=treap.merge(r1,treap.merge(r4,treap.merge(r3,treap.merge(r2,r5))));
		}
		if(op==6){
			treap.split(root,c,r1,r3);treap.split(r1,b-1,r1,r2);
			r2=treap.copy(r2);treap.a[r2].rev^=1;root=treap.merge(r1,treap.merge(r2,r3));
		}
		// if(i<=9){
		// 	cout<<op<<' '<<b<<' '<<c<<' ';
		// 	if(2<=op&&op<=5) cout<<d<<' ';
		// 	if(4<=op&&op<=5) cout<<e<<' ';
		// 	cout<<'\n';
		// }
		if(cnt>=12*N){
			tot=0;treap.down(root);cnt=root=0;
			for(int j=1;j<=n;++j) root=treap.merge(root,treap.newnode(f[j]));
		}
		//printf("cnt:%d\n",cnt);
		//for(int i=1;i<=n;++i) cout<<f[i]<<' ';cout<<'\n';
	}
	tot=0;treap.down(root);
	for(int i=1;i<=n;++i) cout<<f[i]<<' ';
	std::cerr<<1.0*clock()/CLOCKS_PER_SEC;
	return 0;
}
2024/3/30 16:33
加载中...