不懂就问,本地输出正确,交上去评测全WA是什么原因
查看原帖
不懂就问,本地输出正确,交上去评测全WA是什么原因
494601
gcx12012楼主2023/7/12 16:14
#include<bits/stdc++.h>
#include<cmath>
#define ld long double
#define ll long long
#define For(i,a,b) for(ll i=a;i<=b;i++)
#define Rof(i,a,b) for(ll i=a;i>=b;i--)
#define N 200010
#define pb push_back
#define mk make_pair
#define pque priority_queue

using namespace std;
int ls[N*50],rs[N*50],pri[N*50],sz[N*50],tag[N*50];
ll sum[N*50],val[N*50];
int rt[N];
int cnt=0,n,xx,yy,zz;

ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int add(int x){
	sum[++cnt]=val[cnt]=x;
	sz[cnt]=1;
	pri[cnt]=rand();
	return cnt;
}
int cop(int x){
	int now=add(0);
	ls[now]=ls[x];
	rs[now]=rs[x];
	pri[now]=pri[x];
	sz[now]=sz[x];
	val[now]=val[x];
	sum[now]=sum[x];
	return now;
}
void pushup(int x){
	sz[x]=sz[ls[x]]+sz[rs[x]]+1;
	sum[x]=sum[ls[x]]+sum[rs[x]]+val[x];
}
void pushdown(int x){
	if(!tag[x]) return;
	if(ls[x]) ls[x]=cop(ls[x]);
	if(rs[x]) rs[x]=cop(rs[x]);
	swap(ls[x],rs[x]);
	if(ls[x]) tag[ls[x]]^=1;
	if(rs[x]) tag[rs[x]]^=1;
	tag[x]=0;
}
void split(int now,int k,int &x,int &y){
	if(!now){
		x=y=0;
		return;
	}
	pushdown(now);
	int u=sz[ls[now]]+1;
	if(u<=k){
		x=cop(now);
		split(rs[x],k-u,rs[x],y);
		pushup(x);
	}else{
		y=cop(now);
		split(ls[y],k,x,ls[y]);
		pushup(y);
	}
}
int merge(int x,int y){
	if(!x || !y) return x+y;
	pushdown(x);
	pushdown(y);
	if(pri[x]<=pri[y]){
		rs[x]=merge(rs[x],y);
		pushup(x);
		return x;
	}else{
		ls[y]=merge(x,ls[y]);
		pushup(y);
		return y;
	}
}

int main()
{
	srand(20090130);
	n=read();
	ll lstans=0;
	For(i,1,n){
		ll v=read(),op=read(),l,r;
		rt[i]=rt[v];
		if(op==1){
			l=read()^lstans,r=read()^lstans;
			split(rt[i],l,xx,yy);
			rt[i]=merge(merge(xx,add(r)),yy);
		}else if(op==2){
			l=read()^lstans;
			split(rt[i],l,xx,zz);
			split(xx,l-1,xx,yy);
			rt[i]=merge(xx,zz);
		}else if(op==3){
			l=read()^lstans,r=read()^lstans;
			split(rt[i],r,xx,zz);
			split(xx,l-1,xx,yy);
			tag[yy]^=1;
			rt[i]=merge(merge(xx,yy),zz);
		}else{
			l=read()^lstans,r=read()^lstans;
			split(rt[i],r,xx,zz);
			split(xx,l-1,xx,yy);
			lstans=sum[yy];
			cout<<sum[yy]<<endl;
			rt[i]=merge(merge(xx,yy),zz);
		}
	}
	return 0;
}
2023/7/12 16:14
加载中...