FHQ Treap 求助,悬赏三小号关注
查看原帖
FHQ Treap 求助,悬赏三小号关注
571147
zhlzt楼主2023/8/6 16:55

样例过不了,提交上去大红大紫:https://www.luogu.com.cn/record/119350527

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int root[N],cnt=0;
struct FHQTreap{
	int ls,rs,pri,size,tag;
	long long sum; int val;
}tree[N<<7];
int newnode(int p){
	tree[++cnt].size=1;
	tree[cnt].pri=rand();
	tree[cnt].ls=tree[cnt].rs=0;
	tree[cnt].sum=tree[cnt].val=p;
	tree[cnt].tag=0; return cnt;
}
int clone(int p){
	int res=newnode(0);
	tree[res]=tree[p]; return res;
}
void replace(int p){
	int pl=tree[p].ls,pr=tree[p].rs;
	tree[p].size=tree[pl].size+tree[pr].size+1;
	tree[p].sum=tree[pl].sum+tree[pr].sum+tree[p].val;
}
void pushdown(int p){
	if(!tree[p].tag) return;
	if(tree[p].ls) tree[p].ls=clone(tree[p].ls);
	if(tree[p].rs) tree[p].rs=clone(tree[p].rs);
	swap(tree[p].ls,tree[p].rs); tree[p].tag=0;
	if(tree[p].ls) tree[tree[p].ls].tag^=1;
	if(tree[p].rs) tree[tree[p].rs].tag^=1;
}
void split(int p,int d,int &pl,int &pr){
	if(p==0){pl=pr=0;return;} pushdown(p);
	if(tree[tree[p].ls].size<d){  pl=clone(p);
        int pls=tree[pl].ls,prs=tree[pl].rs;
		split(prs,d-tree[tree[p].ls].size-1,tree[pl].rs,pr);
		replace(pl); return;
	}
	if(tree[tree[p].rs].size>=d){ pr=clone(p);
		split(tree[pr].ls,d,pl,tree[pr].ls);
		replace(pr); return;
	}
}
int merge(int pl,int pr){
	if(pl==0||pr==0) return pl+pr;
	pushdown(pl); pushdown(pr);
	if(tree[pl].pri>tree[pr].pri){
		tree[pl].rs=merge(tree[pl].rs,pr);
		replace(pl); return pl;
	}
	if(tree[pl].pri<=tree[pr].pri){
		tree[pr].ls=merge(pl,tree[pr].ls);
		replace(pr); return pr;
	}
}
int main(){
	srand(time(NULL));
	long long lastans=0;
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int v,opt;scanf("%d%d",&v,&opt);
		if(opt==1){
			long long p;scanf("%lld",&p);
			long long d;scanf("%lld",&d);
			p^=lastans; d^=lastans;
			int pl,pr; split(root[v],p,pl,pr);
			root[i]=merge(merge(pl,newnode(d)),pr);
		}
		if(opt==2){
			long long p;scanf("%lld",&p); p^=lastans;
			int pl,pr,q; split(root[v],p,pl,pr);
			split(pl,p-1,pl,q); root[i]=merge(pl,pr);
		}
		if(opt==3){
			long long l;scanf("%lld",&l);
			long long r;scanf("%lld",&r);
			l^=lastans; r^=lastans;
			int pl,pr,q; split(root[v],r,pl,pr);
			split(pl,l-1,pl,q); tree[q].tag^=1;
			root[i]=merge(merge(pl,q),pr);
		}
		if(opt==4){
			long long l;scanf("%lld",&l);
			long long r;scanf("%lld",&r);
			l^=lastans; r^=lastans;
			int pl,pr,q; split(root[v],r,pl,pr);
			split(pl,l-1,pl,q);
			lastans=tree[q].sum; printf("%lld\n",lastans);
			root[i]=merge(merge(pl,q),pr);
		}
	}
	return 0;
}
2023/8/6 16:55
加载中...