Splay #10TLE求条(有数据)
查看原帖
Splay #10TLE求条(有数据)
766429
Broken_dream楼主2025/1/22 09:44

rt. 数据往下翻

#include<iostream>
using namespace std;
const int N = 114514+1919810,inf = 0x7f7f7f7f;

int m,n,x,opt,tot,root,last,ansxor;
struct node{
	int son[2],fa,cnt,data,sizee;
}tn[N];

void add_node(int x,int w){
	tn[x].data = w;
	tn[x].sizee = tn[x].cnt = 1;
}

void push_up(int x){
	tn[x].sizee = tn[tn[x].son[0]].sizee + tn[tn[x].son[1]].sizee + tn[x].cnt;
	return;
}

int find(int k){
	int x = root;
	while(tn[x].son[tn[x].data<k] && tn[x].data != k) x = tn[x].son[tn[x].data<k];
	return x;
}

void rotate(int x){
	int y = tn[x].fa,z = tn[y].fa,k = (tn[y].son[1] == x);
	tn[y].son[k] = tn[x].son[k^1];
	tn[tn[x].son[k^1]].fa = y;
	tn[x].son[k^1] = y;
	tn[y].fa = x;
	tn[z].son[tn[z].son[1] == y] = x;
	tn[x].fa = z;
	push_up(y);push_up(x);
}

void splay(int x,int k){
	while(tn[x].fa ^ k){
		int y = tn[x].fa,z = tn[y].fa;
		if(z^k) ((tn[y].son[1] == x) ^ (tn[z].son[1] == y)) ? rotate(x) : rotate(y);
		rotate(x);
	}
	if(!k) root = x;
}

int pre_nxt(int x,int k){
	splay(find(x),0);
	if(tn[root].data < x && !k) return root;
	if(tn[root].data > x && k) return root;
	int p = tn[root].son[k];
	while(tn[p].son[k^1]) p = tn[p].son[k^1];
	return p;
}

void ins(int k){
	int x = find(k);
	if(tn[x].data != k){
		tn[x].son[tn[x].data < k] = ++tot;
		add_node(tot,k);
		tn[tot].fa = x;
		splay(tot,0);
	}else ++tn[x].cnt,splay(x,0);
}

void del(int k){
	int x = pre_nxt(k,0),y = pre_nxt(k,1);
	splay(x,0);splay(y,x);
	if(tn[tn[y].son[0]].cnt > 1) --tn[tn[y].son[0]].cnt,splay(tn[y].son[0],0);
	else tn[y].son[0] = 0,splay(y,0);
}

int f_rank(int x){
	splay(find(x),0);
	if(tn[root].data < x){
		while(tn[root].son[1] && tn[tn[root].son[1]].data < x) splay(tn[root].son[1],0);
		return tn[tn[root].son[0]].sizee + 2;
	}
	return tn[tn[root].son[0]].sizee + 1;
}

int f_val(int p,int x){
	if(!p) return 1;
	int siz = tn[tn[p].son[0]].sizee;
	if(siz < x && x <= siz+tn[p].cnt) return tn[p].data;
	if(x <= siz) return f_val(tn[p].son[0],x);
	else return f_val(tn[p].son[1],x-siz-tn[p].cnt);
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin >> m >> n;
	ins(-inf);ins(+inf);
	for(int i = 1;i <= m && cin >> x;++i) ins(x);
	for(int i = 1;i <= n;++i){
		cin >> opt >> x;x^= last;
		if(opt == 1) ins(x);
		else if(opt == 2) del(x);
		else if(opt == 3) ins(x),last = f_rank(x)-1,del(x);
		else if(opt == 4) last = f_val(root,x+1);
		else if(opt == 5) ins(x),last = tn[pre_nxt(x,0)].data,del(x);
		else if(opt == 6) ins(x),last = tn[pre_nxt(x,1)].data,del(x);
		if(3 <= opt && opt <= 6) ansxor ^= last;
	}
	cout << ansxor;
	return 0;
}
2025/1/22 09:44
加载中...