Splay 52pts求调,剩下的都是WA
查看原帖
Splay 52pts求调,剩下的都是WA
298231
Skylmt楼主2022/7/23 21:18

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<ctime>
#include<deque>
#include<fstream>
#include<string.h>
#define mod 1000000007
#define register
#define fint register int
typedef unsigned long long ull;
typedef long long ll;
using namespace std;

inline ll read()
{
        ll x=0;
        char ch=0;
        while(ch<'0'||ch>'9') ch=getchar();
        while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=getchar();
        return x;
}


int n,root,cnt;

struct node{
	int ch[2],fa,val,cnt,siz;
}spl[1000010];

void update(int x)
{
	spl[x].siz=spl[spl[x].ch[0]].siz+spl[spl[x].ch[1]].siz+spl[x].cnt;
}

inline bool ident(int x,int fa)
{
	return spl[fa].ch[1]==x;
}
inline void connect(int x,int fa,int s)
{
	spl[fa].ch[s]=x;
	spl[x].fa=fa;
}

void rotate(int x)
{
	int y=spl[x].fa;
	int z=spl[y].fa;
	int k=ident(x,y);
	connect(spl[x].ch[k^1],y,k);
	connect(x,z,ident(y,z));
	connect(y,x,k^1);
	update(y);
	update(x);
}

void splay(int x,int top)
{
	if(!top) root=x;
	while(spl[x].fa!=top)
	{
		int y=spl[x].fa,z=spl[y].fa;
		if(z!=top) ident(y,z)^(x,y)?rotate(x):rotate(y);
		rotate(x);
	} 
} 

void add_node(int &now,int fa,int val)
{
	now=++cnt;
	spl[now].val=val;
	spl[now].fa=fa;
	spl[now].siz=spl[now].cnt=1;
}

void insert(int val,int &now=root,int fa=0)
{
	
	if(!now)
	{
		add_node(now,fa,val);
		splay(now,0);
	}
	else if(val<spl[now].val) insert(val,spl[now].ch[0],now);
	else if(val>spl[now].val) insert(val,spl[now].ch[1],now);
	else
	{
		spl[now].cnt++;
		splay(now,0);
	}
}

void find_rank(int x)
{
	int now=root;
	if(!now) return;
	while(spl[now].ch[x>spl[now].val]&&x!=spl[now].val)
	{
		now=spl[now].ch[x>spl[now].val];
	}
	splay(now,0);
}

int pre(int x)
{
	find_rank(x);
	int now=spl[root].ch[0];
	while(spl[now].ch[1])
	{
		now=spl[now].ch[1];
	}
	return now;
}

int nxt(int x)
{
	find_rank(x);
	int now=spl[root].ch[1];
	while(spl[now].ch[0])
	{
		now=spl[now].ch[0];
	}
	return now;
}

int find_x(int x)
{
	int now=root;
	while(true)
	{
		if(x<=spl[spl[now].ch[0]].siz)
		{
			now=spl[now].ch[0];
		}
		else
		{
			x-=(spl[spl[now].ch[0]].siz+spl[now].cnt);
			if(x<=0) return now;
			else now=spl[now].ch[1];
		}
	}
}


void del(int x)
{
	int a=pre(x),b=nxt(x);
	splay(a,0);
	splay(b,a);
	int tmp=spl[b].ch[0];
	if(spl[tmp].cnt>1)
	{
		spl[tmp].cnt--;
		splay(tmp,0);
	}
	else spl[b].ch[0]=0;
}

int main()
{
	n=read();
	int opt,x;
	insert(0x7fffffff);
	insert(-0x7fffffff);
	for(int i=1;i<=n;i++)
	{
		opt=read();x=read();
		if(opt==1) insert(x);
		else if(opt==2) del(x);
		else if(opt==3)
		{
			find_rank(x);
			printf("%d\n",spl[spl[root].ch[0]].siz);
		}
		else if(opt==4)
		{
			printf("%d\n",spl[find_x(x+1)].val);
		}
		else if(opt==5)
		{
			insert(x);
			printf("%d\n",spl[pre(x)].val);
			del(x);
		}
		else if(opt==6)
		{
			insert(x);
			printf("%d\n",spl[nxt(x)].val);
			del(x);
		}
	}
	return 0;
}
2022/7/23 21:18
加载中...