Splay最后一个点T了,求调
查看原帖
Splay最后一个点T了,求调
669329
deyi楼主2024/4/4 14:38
#include<bits/stdc++.h>
using namespace std;
struct node{
	int sum, l, r, fa, size;
}a[1000010];
int len, n, root;
void init(int x){
	if(!x)return;
	a[x].size=a[a[x].l].size+a[a[x].r].size+1;
}
void splay(int x, int rt){
	while(a[x].fa!=rt&&x){
		int fa=a[a[x].fa].fa;
		if(a[fa].l==a[x].fa)a[fa].l=x;
		else a[fa].r=x;
		if(a[a[x].fa].l==x){
			a[a[x].fa].l=a[x].r;
			a[a[x].r].fa=a[x].fa;
			a[x].r=a[x].fa;
		}
		else{
			a[a[x].fa].r=a[x].l;
			a[a[x].l].fa=a[x].fa;
			a[x].l=a[x].fa;
		}
		a[a[x].fa].fa=x;
		a[x].fa=fa;
		init(a[x].l);init(a[x].r);init(x);
	}
} 
void find(int x){
	int pos=root;
	while(pos){
		if(a[pos].sum>x)pos=a[pos].l;
		if(a[pos].sum<x)pos=a[pos].r;
		if(a[pos].sum==x)break;
	}
	splay(pos,0);
	root=pos;
}
void push(int x){
	int pos=root;
	while(pos){
		if(a[pos].sum>x){
			if(!a[pos].l){
				a[pos].l=++len;
				a[len].fa=pos;
				a[len].sum=x;
				a[len].size=1;
				break;
			}
			pos=a[pos].l;
		}
		else{
			if(!a[pos].r){
				a[pos].r=++len;
				a[len].fa=pos;
				a[len].sum=x;
				a[len].size=1;
				break;
			}
			pos=a[pos].r;
		}
	}
	if(!pos)root=++len,a[len].sum=x,a[len].size=1;
	splay(len,0);
	root=len;
}
void del(int x){
	find(x);
	int cnt=root;
	if(a[root].l){
		int pos=a[root].l, r=a[root].r;
		while(a[pos].r)pos=a[pos].r;
		splay(pos,root);
		a[a[root].l].r=a[root].r;
		a[a[root].r].fa=a[root].l;
		root=a[root].l;
		a[cnt].l=a[cnt].r=a[cnt].size=a[cnt].sum=0;
		init(root);
	}
	else root=a[root].r,a[cnt].l=a[cnt].r=a[cnt].size=a[cnt].sum=0;
	a[root].fa=0;
}
int dfs3(int x){
	int pos=root, ans=0;
	while(pos){
		if(a[pos].sum>=x)pos=a[pos].l;
		else ans=pos,pos=a[pos].r;
	}
	splay(ans,0);
	root=ans;
	return root;
}
int dfs4(int x){
	int pos=root, ans=0;
	while(pos){
		if(a[pos].sum<=x)pos=a[pos].r;
		else ans=pos,pos=a[pos].l;
	}
	splay(ans,0);
	root=ans;
	return root;
}
int dfs1(int x){
	x=dfs3(x);
	return a[a[root].l].size+1;
}
int dfs2(int x){
	find(INT_MIN);
	int now=a[root].r;
	while(now){
		if(a[a[now].l].size+1==x)break;
		if(a[a[now].l].size>=x)now=a[now].l;
		else x-=(a[a[now].l].size+1),now=a[now].r;
	}
	splay(now,0);
	root=now;
	return a[root].sum;
}
int main(){
	ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    push(INT_MIN);
    while(n--){
    	int op, x;
    	cin>>op>>x;
    	if(op==1)push(x);
    	if(op==2) del(x);
    	if(op==3)cout<<dfs1(x)<<endl;
    	if(op==4)cout<<dfs2(x)<<endl;
    	if(op==5)cout<<a[dfs3(x)].sum<<endl;
    	if(op==6)cout<<a[dfs4(x)].sum<<endl;
	}
    return 0;
}
/*
5
1 1
1 2
1 3
2 2
1 4
*/
2024/4/4 14:38
加载中...