这怎么就RE了呢(fhq Treap)
查看原帖
这怎么就RE了呢(fhq Treap)
132772
Hokage楼主2020/9/20 22:54

过了板子题就复制的应该spilt merge kth没问题

t应该也没有开小

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

const int N=1000050;
int tot=0;
int root=0;
int n,m;
int x,y,z;

struct Node
{
	int val,rnd;
	int size;
	int ch[2];
}t[N<<1];

void update(int id)
{
	t[id].size=t[t[id].ch[0]].size+t[t[id].ch[1]].size+1;
}

int newNode(int x)
{
	tot++;
	t[tot].size=1;
	t[tot].ch[0]=t[tot].ch[1]=0;
	t[tot].val=x;
	t[tot].rnd=rand();
	return tot;
}

void split(int id,int val,int &x,int &y)
{
	if(!id)
	{
		x=y=0;
		return ;
	}
	if(t[id].val<=val)
	{
		x=id;
		split(t[id].ch[1],val,t[id].ch[1],y);
	}
	else
	{
		y=id;
		split(t[id].ch[0],val,x,t[id].ch[0]);
	}
	update(id);
}

int merge(int x,int y)
{
	if(!x||!y) return x+y;
	if(t[x].rnd<t[y].rnd)
	{
		t[x].ch[1]=merge(t[x].ch[1],y);
		update(x);
		return x;
	}
	else
	{
		t[y].ch[0]=merge(x,t[y].ch[0]);
		update(y);
		return y;
	}
}

int kth(int id,int k) 
{
	int ksize=t[t[id].ch[0]].size;
    if(k<=ksize) kth(t[id].ch[0],k);
    else if(k==ksize+1) return t[id].val;
    else kth(t[id].ch[1],k-ksize-1);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int k;
		scanf("%d",&k);
		split(root,k,x,y);
		root=merge(merge(x,newNode(k)),y);
	}	
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		char a[4];
		scanf("%s",a);
		if(a[0]=='a')
		{
			int k;
			scanf("%d",&k);
			split(root,k,x,y);
			root=merge(merge(x,newNode(k)),y);
			n++;
		}
		else
		{	
			int mid;
			mid=(n+1)/2;
			printf("%d\n",kth(root,mid));
		}
	}
	return 0;
} 
2020/9/20 22:54
加载中...