求助编译失败
查看原帖
求助编译失败
107266
starco楼主2021/12/30 21:53
#include<bits/stdc++.h>
using namespace std;
int n,top=1;
int rd()
{
	int f=1,su=0;
	char c=getchar();
	while(c<'0'&&c>'9')
	{
		if(c=='-')
		{
			f=-1;
			c=getchar();
		}
	}
	while(c>='0'&&c<='9'&&c!=' ')
	{
		su=su*10+c-'0';
		c=getchar();
	}
	return su*f;
}
struct treap{
	int v,cnt,ch[2],hv;
	int ran;
};
treap t[10000033]={{0,0,{0,0},0,0},{2147483647,0,{0,0},0,2147483647}};
int newl(int v)
{
	t[++top]=(treap){v,1,{0,0},1,rand()};
	return top;
}
void up(int id)
{
	t[id].hv=t[t[id].ch[0]].hv+t[t[id].ch[1]].hv+t[id].cnt;
}
void turn(int now,bool c)
{
	swap(t[now].v,t[t[now].ch[c]].v);
	swap(t[now].cnt,t[t[now].ch[c]].cnt);
	swap(t[now].ran,t[t[now].ch[c]].ran);
	swap(t[t[now].ch[c]].ch[0],t[t[now].ch[c]].ch[1]);
	swap(t[now].ch[0],t[now].ch[1]);
	swap(t[now].ch[c],t[t[now].ch[!c]].ch[!c]);
	up(t[now].ch[!c]);
	up(now);
}
void add(int now,int v)
{
	if(t[now].v==v)
	{
		++t[now].cnt;
		up(now);
		return;
	}
	bool c=(t[now].v<v);
	if(!t[now].ch[c])//等于0执行 
	{
		t[now].ch[c]=newl(v);
		if(t[t[now].ch[c]].ran>t[now].ran) turn(now,c);
		up(now);
		return;
	}
	add(t[now].ch[c],v);
	if(t[t[now].ch[c]].ran>t[now].ran) turn(now,c);
	up(now);
}
void del(int now,int v)
{
	if(!now)return;
	if(t[now].v==v)
	{
		t[now].cnt=max(0,t[now].cnt-1);
		up(now);
		return;
	}
	bool c=(t[now].v<v);
	del(t[now].ch[c],v);
	up(now);
}
int szp(int now,int v)
{
	if(!now)return 0;
	if(t[now].v>=v)
	return szp(t[now].ch[0],v);
	else
	return t[now].hv-t[t[now].ch[1]].hv+szp(t[now].ch[1],v);
}
int pzs(int now,int k)
{
	if(!now)return 0;
	if(k>t[t[now].ch[0]].hv&&k<=t[now].hv-t[t[now].ch[1]].hv)
	return t[now].v;
	if(k<=t[t[now].ch[0]].hv)
	return pzs(t[now].ch[0],k);
	else
	return pzs(t[now].ch[1],k-t[now].hv+t[t[now].ch[1]].hv);
}
int last(int now,int k)
{
	if(!now)return -2147483647;
	if(k>t[now].v)
	{
		int oz=last(t[now].ch[1],k);
		if(t[now].cnt)
		return max(oz,t[now].v);
		else return max(oz,last(t[now].ch[0],k));
	}//return max(finds_last(t[now].s[1],x),(t[now].lj)?(t[now].v):(finds_last(t[now].s[0],x)));
	else return last(t[now].ch[0],k);
}
int next(int now,int k)
{
	if(!now)return 2147483647;
	if(k<t[now].v)
	{
		int oz=next(t[now].ch[0],k);
		if(t[now].cnt)
		return min(oz,t[now].v);
		else return min(oz,next(t[now].ch[1],k));
	}
	else return next(t[now].ch[1],k);
}
int main()
{
	int aa,bb;
	n=rd();
	for(int i=1;i<=n;i++)
	{
		aa=rd();
		bb=rd();
		switch(aa)
		{
			case 1:{
				add(1,bb);
				break;
			}
			case 2:{
				del(1,bb);
				break;
			}
			case 3:{
				printf("%d\n",szp(1,bb)+1);
				break;
			}
			case 4:{
				printf("%d\n",pzs(1,bb));
				break;
			}
			case 5:{
				printf("%d\n",last(1,bb));
				break;
			}
			case 6:{
				printf("%d\n",next(1,bb));
				break;
			}
		}
	}
	return 0;
}
2021/12/30 21:53
加载中...