fhq_treap 30 分求助(过了7-12)!
查看原帖
fhq_treap 30 分求助(过了7-12)!
363036
chlchl楼主2022/5/11 09:14

rt,问题如上,代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 10;
struct fhq_treap{
	int val, sum, pri, sz, tag, son[2];
} trp[N << 6];
int n, sum, rt[N];

void update(int u){
	trp[u].sz = trp[trp[u].son[0]].sz + trp[trp[u].son[1]].sz + 1;
	trp[u].sum = trp[trp[u].son[0]].sum + trp[trp[u].son[1]].sum + trp[u].val;
}

int newnode(int val){
	++sum;
	trp[sum].val = trp[sum].sum = val, trp[sum].pri = rand(), trp[sum].sz = 1;
	return sum;
}

void pushdown(int u){
	int ls = trp[u].son[0], rs = trp[u].son[1];
	if(trp[u].tag){
		if(ls){
			int lls = newnode(0), rls = newnode(0);
			trp[lls] = trp[trp[ls].son[0]], trp[rls] = trp[trp[ls].son[1]];
			swap(trp[ls].son[0], trp[ls].son[1]);
			trp[trp[u].son[0]].tag ^= 1;
		}
		if(rs){
			int rls = newnode(0), rrs = newnode(0);
			trp[rls] = trp[trp[rs].son[0]], trp[rrs] = trp[trp[rs].son[1]];
			swap(trp[rs].son[0], trp[rs].son[1]);
			trp[trp[u].son[1]].tag ^= 1;
		}
		trp[u].tag ^= 1;
	}
}

void split(int u, int k, int &rta, int &rtb){
	if(!u){
		rta = rtb = 0;
		return ;
	}
	pushdown(u);
	if(trp[trp[u].son[0]].sz < k){
		rta = newnode(0);
		trp[rta] = trp[u];
		split(trp[rta].son[1], k - trp[trp[rta].son[0]].sz - 1, trp[rta].son[1], rtb);
		update(rta);
	}else{
		rtb = newnode(0);
		trp[rtb] = trp[u];
		split(trp[rtb].son[0], k, rta, trp[rtb].son[0]);
		update(rtb);
	}
}

int merge(int rta, int rtb){
	if(!rta || !rtb)	return rta + rtb;
	if(trp[rta].pri < trp[rtb].pri){
		pushdown(rta);
		trp[rta].son[1] = merge(trp[rta].son[1], rtb);
		update(rta);
		return rta;
	}else{
		pushdown(rtb);
		trp[rtb].son[0] = merge(rta, trp[rtb].son[0]);
		update(rtb);
		return rtb;
	}
}

void insert(int ver, int k, int w){
	int x, y;
	split(rt[ver], k, x, y);
	rt[ver] = merge(merge(x, newnode(w)), y);
}

void del(int ver, int w){
	int x, y, z;
	split(rt[ver], w, x, z);
	split(x, w - 1, x, y);
	rt[ver] = merge(x, z);
}

void reverse(int ver, int l, int r){
	int x, y, z;
	split(rt[ver], l - 1, x, y);
	split(y, r - l + 1, y, z);
	int ls = newnode(0), rs = newnode(0);
	trp[ls] = trp[trp[y].son[0]], trp[rs] = trp[trp[y].son[1]];
	swap(trp[y].son[0], trp[y].son[1]);
	trp[y].tag ^= 1;
	rt[ver] = merge(x, merge(y, z));
}

int query(int ver, int l, int r){
	int x, y, z;
	split(rt[ver], l - 1, x, y);
	split(y, r - l + 1, y, z);
	int ans = trp[y].sum;
	rt[ver] = merge(x, merge(y, z));
	return ans;
}

main(){
	int lastans = 0;
	scanf("%lld", &n);
	for(int i=1;i<=n;i++){
		int v, op, p, x, l, r;
		scanf("%lld%lld", &v, &op);
		rt[i] = rt[v];
		if(op == 1){
			scanf("%lld%lld", &p, &x);
			p ^= lastans, x ^= lastans;
			insert(i, p, x);
		}else if(op == 2){
			scanf("%lld", &p);
			p ^= lastans;
			del(i, p);
		}else if(op == 3){
			scanf("%lld%lld", &l, &r);
			l ^= lastans, r ^= lastans;
			if(l > r)	swap(l, r);
			reverse(i, l, r);
		}else if(op == 4){
			scanf("%lld%lld", &l, &r);
			l ^= lastans, r ^= lastans;
			if(l > r)	swap(l, r);
			lastans = query(i, l, r);
			printf("%lld\n", lastans);
		}
	}
	return 0;
}
2022/5/11 09:14
加载中...