求助一下普通treap
查看原帖
求助一下普通treap
264548
Tangent233楼主2021/5/5 10:26
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int now=0,rt=0;
struct node
{
	int lc,rc,key,pri,cnt,sz;
	string sb;
	#define l(x) t[x].lc
	#define r(x) t[x].rc
	#define v(x) t[x].key
	#define p(x) t[x].pri
	#define c(x) t[x].cnt
	#define s(x) t[x].sz
	#define sb(x) t[x].sb
}t[maxn];
inline void upt(const int &k)
{
	s(k)=s(l(k))+s(r(k))+c(k);
}
inline void zig(int &k)
{
	int y=l(k);
	l(k)=r(y);
	r(y)=k;
	s(y)=s(k);
	upt(k);
	k=y;
}
inline void zag(int &k)
{
	int y=r(k);
	r(k)=l(y);
	l(y)=k;
	s(y)=s(k);
	upt(k);
	k=y;
}
void in(int &k,const int &key,const string &a)
{
	if(!k)
	{
		k=++now;
		sb(k)=a;
		v(k)=key;
		p(k)=rand();
		c(k)=s(k)=1;
		l(k)=r(k)=0;
		return;
	}
	else ++s(k);
	if(v(k)==key) ++c(k);
	else
	 	if(key<v(k))
	 	{
	 		in(l(k),key,a);
	 		if( p(l(k))<p(k) ) zig(k);
	 	}
	 	else
	 	{
	 		in(r(k),key,a);
	 		if( p(r(k))<p(k) ) zag(k);
	 	}
	return;
}
void sakuzyo(int &k,const int &key)
{
	if(v(k)==key)
	{
		if(c(k)>1) --c(k),--s(k);
		else if(!l(k)||!r(k))
			k=l(k)+r(k);
		else
			if(p(l(k))<p(r(k)))
			{
				zig(k);
				sakuzyo(k,key);
			}
			else
			{
				zag(k);
				sakuzyo(k,key);
			}
		return;
	}
	--s(k);
	if(key<v(k)) sakuzyo(l(k),key);
	else sakuzyo(r(k),key);
	return;
}
int quepre(const int &key)
{
	int x=rt,res=-1*(2<<29);
	while(x)
	{
		if(v(x)<key)
		{
			res=v(x);
			x=r(x);
		}
		else x=l(x);
	}
	return res;
}
int quesuf(const int &key)
{
	int x=rt,res=(2<<29);
	while(x)
	{
		if(v(x)>key)
		{
			res=v(x);
			x=l(x);
		}
		else x=r(x);
	}
	return res;
}
int quekth(int k)
{
	int x=rt;
	while(x)
	{
		if(s(l(x))<k&&s(l(x))+c(x)>=k) return v(x);
		if(s(l(x))>=k) x=l(x);
		else
		{
			k-=s(l(x))+c(x);
			x=r(x);
		}
	}
	return 0;
}
void squekth(int k)
{
	int x=rt;
	while(x)
	{
		if(s(l(x))<k&&s(l(x))+c(x)>=k)
			cout<<sb(x)<<endl;
		if(s(l(x))>=k) x=l(x);
		else
		{
			k-=s(l(x))+c(x);
			x=r(x);
		}
	}
	return;
}
int querank(const int &key)
{
	int x=rt,res=0;
	while(x)
	{
		if(key==v(x)) return res+s(l(x))+1;
		if(key<v(x)) x=l(x);
		else
		{
			res+=s(l(x))+c(x);
			x=r(x);
		}
	}
	return 0; 
}
string aaaa;
int main()
{
	srand(time(0)*114514+1919810);
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>aaaa;
		in(rt,i*100010,aaaa);
	}
	int m;scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		cin>>aaaa;
		int p;cin>>p;
		int now=quekth(p+1);
		in(rt,now-1,aaaa);
	}
	int q;scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		int p;cin>>p;
		squekth(p+1);
	}
	return 0;
}

思路就是最开始的每本书他的权值差值为最多可能的插入操作数,插入的时候询问排名,然后插入即可

为什么会wa呢

2021/5/5 10:26
加载中...