球球了,给个hack吧
查看原帖
球球了,给个hack吧
167279
Danno0v0楼主2022/10/2 14:43
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int f,size,cnt,value,son[2];
}tree[5000001];
#define Getson(x) tree[tree[x].f].son[1]==x
int root,cnt;
void update(int x)
{
	tree[x].size=tree[x].cnt;
	if(tree[x].son[0]) tree[x].size+=tree[tree[x].son[0]].size;
	if(tree[x].son[1]) tree[x].size+=tree[tree[x].son[1]].size;
}
void Print(int);
void rotate(int x)
{
	int father=tree[x].f,grand_father=tree[father].f;
	bool which=Getson(x);
	tree[father].son[which]=tree[x].son[!which];
	tree[tree[father].son[which]].f=father;
	tree[x].son[!which]=father;
	tree[father].f=x;
	tree[x].f=grand_father;
	if(grand_father)
		tree[grand_father].son[tree[grand_father].son[1]==father]=x;
	update(father);	
	update(x);
}
void Splay(int x)
{
	for(int fa;fa=tree[x].f;rotate(x))
		if(tree[fa].f)
			rotate(Getson(x)==Getson(fa)?fa:x);
	root=x;
}
void Insert(int x)
{
	if(!root)
	{
		root=++cnt;
		tree[cnt].size=tree[cnt].cnt=1;
		tree[cnt].f=tree[cnt].son[0]=tree[cnt].son[1]=0;
		tree[cnt].value=x;
		return;
	}
	else
	{
		int now=root,fa=0;
		while(now)
		{
			if(tree[now].value==x)
			{
				tree[now].cnt++;
				update(now);
				update(fa);
				Splay(now);
				return;
			}
			fa=now,now=tree[now].son[x>tree[now].value];	
		}
		now=tree[fa].son[x>tree[fa].value]=++cnt;
		tree[cnt].size=tree[cnt].cnt=1;
		tree[cnt].f=fa;
		tree[cnt].son[0]=tree[cnt].son[1]=0;
		tree[cnt].value=x;
		update(fa);
		Splay(now);
		return;
	}
}
void Del(int x)
{
	int now=root;
	while(now)
	{
		if(tree[now].value==x)
		{
			if(tree[now].cnt>1)
			{
				tree[now].cnt--;
				update(now);
				return;
			}
			Splay(now);
			int Posi=tree[now].son[0];
			if(!Posi)
			{
				root=tree[now].son[1];
				tree[tree[now].son[1]].f=0;
				return;
			} 
			while(tree[Posi].son[1])
				Posi=tree[Posi].son[1];
			Splay(Posi);
			root=Posi;
			tree[Posi].son[1]=tree[now].son[1];
			tree[tree[now].son[1]].f=Posi;
			update(Posi);
			return;
		}
		now=tree[now].son[x>tree[now].value];
	}
}
int Get_Rank(int x)
{
	int now=root,Ans=1;
	while(now)
	{
		if(x<tree[now].value)
			now=tree[now].son[0];
		else
		{
			Ans+=tree[tree[now].son[0]].size;
			if(tree[now].value==x)
			{
				Splay(now);
				return Ans;
			}
			Ans+=tree[now].cnt;
			now=tree[now].son[1];
		}
	}
	return Ans;
}
int Get_Num(int x)
{
	int now=root;
	while(now)
	{
		if(tree[tree[now].son[0]].size>=x)
			now=tree[now].son[0];
		else
		{
			int temp=tree[tree[now].son[0]].size+tree[now].cnt;;
			if(x<=temp)
				return tree[now].value;
			x-=temp;
			now=tree[now].son[1];
		}
	}
	return -1; 
}
int Get_Pre(int x)
{
	int now=tree[root].son[0];
	while(tree[now].son[1])
		now=tree[now].son[1];
	return tree[now].value;
} 
int Get_Suc(int x)
{
	int now=tree[root].son[1];
	while(tree[now].son[0])
		now=tree[now].son[0];
	return tree[now].value;
}
int main()
{
	//freopen("22.in","r",stdin);
	//freopen("CR.out","w",stdout);
	int n,opst,x;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>opst>>x;
		switch(opst)
		{
			case 1:
				Insert(x);
				break;
			case 2:
				Del(x);
				break;
			case 3:
				cout<<Get_Rank(x)<<endl;
				break;
			case 4:
				cout<<Get_Num(x)<<endl;
				break;
			case 5:
				Insert(x),cout<<Get_Pre(x)<<endl,Del(x);
				break;
			case 6:
				Insert(x),cout<<Get_Suc(x)<<endl,Del(x);
				break; 	
		}
	}
}
/*
50
1 577793
1 408221
1 880861
2 408221
1 460353
1 223489
6 577713
4 2
5 889905
2 880861
1 100033
1 73956
1 22575
5 583761
6 571549
1 812645
4 3
1 643621
1 451623
6 14895
1 556691
4 1
1 225789
2 22575
1 632329
3 73956
1 316785
5 101413
4 11
5 639414
6 636353
1 272382
1 434049
2 643621
1 99617
2 577793
1 921581
1 894033
3 223489
1 767367
3 272382
1 642721
1 272033
3 632329
1 737721
1 864513
5 746457
1 877545
1 51097
1 484817

*/
/*
999
1 1888000
1 999999
1 22
1 23
6 24
5 24
2 22
1 30
3 24
1 26
1 29
1 27
1 24
1 25
1 28
4 3
3 29
5 28
*/

已经把splay忘光力 痛苦地调了一天还是没有调处来

2022/10/2 14:43
加载中...