1. 程式人生 > 其它 >【fhq treap】【平衡樹】

【fhq treap】【平衡樹】

fhq不僅比splay跑得快,還比splay好寫得多。

Code模板

#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read()
{
	int x=0,w=1;char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') {w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*w;
}
inline void write(int x)
{
	if(x<0) putchar('-'),x=~(x-1);
	if(x>9) write(x/10);
	putchar('0'+x%10);
}
const int N=1e5+100;
int n,tot,rt;
struct fhq{
	int siz,ls,rs,val,rd;
}t[N];
int newnode(int val)
{
	tot++;t[tot].siz=1;t[tot].ls=t[tot].rs=0;
	t[tot].val=val;t[tot].rd=rand();
	return tot;
}
void pushup(int x)
{
	t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;
}
void split(int now,int val,int &x,int &y)
{
	if(now==0) {x=y=0;return;	}
	if(t[now].val<=val) x=now,split(t[now].rs,val,t[now].rs,y);
	else y=now,split(t[now].ls,val,x,t[now].ls);
	pushup(now);
}
int merge(int x,int y)
{
	if(!x||!y) return x+y;
	if(t[x].rd<t[y].rd)  {t[x].rs=merge(t[x].rs,y);pushup(x);return x;	}
	else {t[y].ls=merge(x,t[y].ls); pushup(y);return y;	}
}

void insert(int val)
{
	int x,y;
	split(rt,val,x,y);
	rt=merge(x,merge(newnode(val),y));
}
void del(int val)
{
	int x,y,z;
	split(rt,val,x,z);split(x,val-1,x,y);
	rt=merge(x,merge(merge(t[y].ls,t[y].rs),z));
}
int findval(int k)
{
	int now=rt;
	while(now)
	{
		if(k==t[t[now].ls].siz+1) return t[now].val;
		if(k<=t[t[now].ls].siz) now=t[now].ls;
		else k-=t[t[now].ls].siz+1,now=t[now].rs;
	}
}
signed main()
{
    n=read();
    for(int i=1;i<=n;++i)
    {
    	int op=read(),x=read(),y,z;
    	if(op==1) insert(x);
    	else if(op==2) del(x);
    	else if(op==3) split(rt,x-1,y,z),write(t[y].siz+1),puts(""),rt=merge(y,z);
    	else if(op==4) write(findval(x)),puts("");
    	else if(op==5) split(rt,x-1,y,z),rt=y,write(findval(t[y].siz)),puts(""),rt=merge(y,z);
    	else if(op==6) split(rt,x,y,z),rt=z,write(findval(1)),puts(""),rt=merge(y,z);
	}
	return 0;
}