treap求助,WA52分
查看原帖
treap求助,WA52分
553625
scp020楼主2023/8/17 16:08
#include<bits/stdc++.h>
using namespace std;
#define Getchar() p1==p2 and (p2=(p1=Inf)+fread(Inf,1,1<<21,stdin),p1==p2)?EOF:*p1++
#define Putchar(c) p3==p4 and (fwrite(Ouf,1,1<<21,stdout),p3=Ouf),*p3++=c
char Inf[1<<21],Ouf[1<<21],*p1,*p2,*p3=Ouf,*p4=Ouf+(1<<21);
inline void read(int &x,char c=Getchar())
{
    bool f=c!='-';
    x=0;
    while(c<48 or c>57) c=Getchar(),f&=c!='-';
    while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
    x=f?x:-x;
}
inline void write(int x)
{
    if(x<0) Putchar('-'),x=-x;
    if(x>=10) write(x/10),x%=10;
    Putchar(x^48);
}
struct node
{
	int val,w,cnt,siz;
	node *lc,*rc;
	node(int Val)
	{
		val=Val,w=rand(),cnt=siz=1,lc=rc=nullptr;
	}
	inline void push()
	{
		siz=(lc==nullptr?0:lc->siz)+(rc==nullptr?0:rc->siz)+cnt;
	}
};
class Treap
{
private:
	node *root;
	inline int askrank(node *rt,int val)
	{
		if(rt==nullptr) return 0;
		int left=rt->lc==nullptr?0:rt->lc->siz;
		if(val==rt->val) return left+1;
		if(val<rt->val) return askrank(rt->lc,val);
		else return askrank(rt->rc,val)+left+rt->cnt;
	}
	inline int askval(node *rt,int pos)
	{
		if(rt==nullptr) return 1e9;
		int left=rt->lc==nullptr?0:rt->lc->siz;
		if(pos<=left) return askval(rt->lc,pos);
		if(pos<=left+rt->cnt) return rt->val;
		return askval(rt->rc,pos-left-rt->cnt);
	}
	inline node *right(node *rt)
	{
		node *q=rt->lc;
		rt->lc=q->rc,q->rc=rt,rt->push(),q->push();
		return q;
	}
	inline node *left(node *rt)
	{
		node *q=rt->rc;
		rt->rc=q->lc,q->lc=rt,rt->push(),q->push();
		return q;
	}
	inline node *add(node *rt,int val)
	{
		node *ret=rt;
		if(rt==nullptr) ret=new node(val);
		else if(val==rt->val) rt->cnt++;
		else if(val<rt->val)
		{
			rt->lc=add(rt->lc,val);
			if(rt->w<rt->lc->w) ret=right(rt);
		}else
		{
			rt->rc=add(rt->rc,val);
			if(rt->w<rt->rc->w) ret=left(rt);
		}
		ret->push();
		return ret;
	}
	inline node *del(node *rt,int val)
	{
		if(rt==nullptr) return nullptr;
		if(val==rt->val)
		{
			if(rt->cnt>1)
			{
				rt->cnt--,rt->push();
				return rt;
			}
			if(rt->lc==nullptr && rt->rc==nullptr)
			{
				delete rt;
				return nullptr;
			}
			node *ret=rt;
			if(rt->rc==nullptr || rt->lc!=nullptr && rt->lc->val>rt->rc->val)
				ret=right(rt),ret->rc=del(rt->rc,val);
			else ret=left(rt),ret->lc=del(rt->lc,val);
			if(ret!=nullptr) ret->push();
			return ret;
		}
		val<rt->val?rt->lc=del(rt->lc,val):rt->rc=del(rt->rc,val);
		if(rt!=nullptr) rt->push();
		return rt;
	}
public:
	Treap()
	{
		root=new node(-1e9),root->rc=new node(1e9),root->push();
	}
	inline void add(int val)
	{
		root=add(root,val);
	}
	inline void del(int val)
	{
		root=del(root,val);
	}
	inline int askrank(int val)
	{
		return askrank(root,val)-1;
	}
	inline int askval(int rank)
	{
		return askval(root,rank+1);
	}
	inline int askpre(int val)
	{
		node *rt=root;
		int ans=-1e9;
		while(rt!=nullptr)
		{
			if(val==rt->val)
			{
				if(rt->lc!=nullptr)
				{
					rt=rt->lc;
					while(rt->rc!=nullptr) rt=rt->rc;
					ans=rt->val;
				}
				break;
			}
			if(rt->val<val && rt->val>ans) ans=rt->val;
			rt=val<rt->val?rt->lc:rt->rc;
		}
		return ans;
	}
	inline int asknext(int val)
	{
		node *rt=root;
		int ans=1e9;
		while(rt!=nullptr)
		{
			if(val==rt->val)
			{
				if(rt->rc!=nullptr)
				{
					rt=rt->rc;
					while(rt->lc!=nullptr) rt=rt->lc;
					ans=rt->val;
				}
				break;
			}
			if(rt->val>val && rt->val<ans) ans=rt->val;
			rt=val<rt->val?rt->lc:rt->rc;
		}
		return ans;
	}
};
Treap treap;
int n;
signed main()
{
	srand(time(0)),read(n);
	for(int i=1,op,x;i<=n;i++)
	{
		read(op),read(x);
		if(op==1) treap.add(x);
		else if(op==2) treap.del(x);
		else if(op==3) write(treap.askrank(x)),Putchar('\n');
		else if(op==4) write(treap.askval(x)),Putchar('\n');
		else if(op==5) write(treap.askpre(x)),Putchar('\n');
		else write(treap.asknext(x)),Putchar('\n');
	}
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}
2023/8/17 16:08
加载中...