Treap求调
查看原帖
Treap求调
571589
_Virgo_楼主2023/4/17 09:56
#include<bits/stdc++.h>
#define N 100010
using namespace std;
#define getchar() (strto1==strto2&&(strto2=(strto1=fsr)+fread(fsr,1,1<<15,stdin),strto1==strto2)?EOF:*strto1++)
char fsr[1<<15],*strto1=fsr,*strto2=fsr;
inline int read()
{
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s*w;
}
inline void write(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int n;
struct Balance_Treap_tree 
{
	#define INF 100000000
	struct node
	{
		int l,r;
		int key,v;
		int size,cnt; 
	}tree[N];
	int root,idx;
	int get_node(int key)
	{
		idx++;
		tree[idx].key=key;
		tree[idx].v=rand();
		tree[idx].cnt=1;
		tree[idx].size=1;
		return idx;
	}
	void pushup(int fa)
	{
		tree[fa].size=tree[tree[fa].l].size+tree[tree[fa].r].size+tree[fa].cnt;
	}
	void zig(int &fa)
	{
		int p=tree[fa].l;
		tree[fa].l=tree[p].r;
		tree[p].r=fa;
		fa=p;
		pushup(tree[fa].r);
		pushup(fa);
	}
	void zag(int &fa)
	{
		int p=tree[fa].r;
		tree[fa].r=tree[p].l;
		tree[p].l=fa;
		fa=p;
		pushup(tree[fa].l);
		pushup(fa);
	}
	void build()
	{
		idx=0,root=1;
		get_node(-INF),get_node(INF);
		tree[1].r=2;
		pushup(root);
		if(tree[1].v<tree[2].v)zag(root);
	}
	void insert(int &fa,int key)
	{
		if(!fa)fa=get_node(key);
		else if(tree[fa].key==key)tree[fa].cnt++;
		else if(tree[fa].key>key)
		{
			insert(tree[fa].l,key);
			if(tree[tree[fa].l].v>tree[fa].v)zig(fa);
		}
		else
		{
			insert(tree[fa].r,key);
			if(tree[tree[fa].r].v>tree[fa].v)zag(fa);
		}
		pushup(fa);
	}
	void remove(int &fa,int key)
	{
		if(!fa)return;
		if(tree[fa].key==key)
		{
			if(tree[fa].cnt>1)tree[fa].cnt--;
			else if(tree[fa].l||tree[fa].r)
			{
				if(!tree[fa].r||tree[tree[fa].l].v>tree[tree[fa].r].v)	
					zig(fa),remove(tree[fa].r,key);
				else
					zag(fa),remove(tree[fa].l,key); 
			}else fa=0;
		}
		else if(tree[fa].key>key)
			remove(tree[fa].l,key);
		else
			remove(tree[fa].r,key);
		pushup(fa);
	} 
	int find_rank(int fa,int key)
	{
		if(tree[fa].key==fa)return tree[tree[fa].l].size+1;
		if(tree[fa].key>key)return find_rank(tree[fa].l,key);
		else return tree[tree[fa].l].size+tree[fa].cnt+find_rank(tree[fa].r,key);
	}
	int find_key(int fa,int rank)
	{
		if(tree[tree[fa].l].size>=rank)return find_key(tree[fa].l,rank);
		if(tree[tree[fa].l].size+tree[fa].cnt>=rank)return tree[fa].key;
		else return find_key(tree[fa].r,rank-tree[tree[fa].l].size-tree[fa].cnt);
	}
	int find_prev(int fa,int x)
	{
		if(!fa)return -INF;
		if(tree[fa].key>=x)return find_prev(tree[fa].l,x);
		else return max(tree[fa].key,find_prev(tree[fa].r,x));
	}
	int find_next(int fa,int x)
	{
		if(!fa)return INF;
		if(tree[fa].key<=fa)return find_next(tree[fa].r,x);
		else return min(tree[fa].key,find_next(tree[fa].l,x));
	}
}Tree;
signed main()
{
	Tree.build();
	n=read();
	while(n--)
	{
		int op=read(),x=read();
		if(op==1)
			Tree.insert(Tree.root,x);
		if(op==2)
			Tree.remove(Tree.root,x);
		if(op==3)
			write(Tree.find_rank(Tree.root,x)-1),puts(""); 
		if(op==4)
			write(Tree.find_key(Tree.root,x+1)),puts(""); 
		if(op==5)
			write(Tree.find_prev(Tree.root,x)),puts(""); 
		if(op==6)
			write(Tree.find_next(Tree.root,x)),puts(""); 
	}
	return 0;
}

样例过了,但只A了一个点

2023/4/17 09:56
加载中...