求助(非旋Treap TLE了)
查看原帖
求助(非旋Treap TLE了)
1135546
qwp____5_0_3楼主2025/1/25 15:16
#include<iostream>
#include<stdio.h>
#include<ctime>
#include<cstdlib>

#define ls(p) tr[p].ls
#define rs(p) tr[p].rs
#define val(p) tr[p].val
#define rnd(p) tr[p].rnd
#define size(p) tr[p].size 
#define N 400010
#define INF 0x3f3f3f3f
inline int read()
{
	int sum=0;
	bool flag=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
	    if(c=='-')flag=1;
	    c=getchar();
	}		
	while(c>='0'&&c<='9')
	{
		sum=sum*10+c-'0';
		c=getchar();
	}
	if(flag)return -sum;
	else return sum;
}

int cnt,n,op,x,root;
struct Treap{
	int ls,rs;
	int val,rnd;
	int size;
};
Treap tr[N];
void push_up(int p);
void newnode(int p);
int _rand();
void merge(int &rt,int x,int y);
void split(int rt,int y,int &a,int &b);
void del(int rt,int p);
void insert(int rt,int p);
int RTN(int rt,int p);
int NTR(int rt,int p);
int qq(int rt,int p);
int hq(int rt,int p);

int main()	//^zxr防伪 
{
	n=read();
	root=1;	    //^zxr保个底 
	newnode(INF);
	rnd(root)=-INF; 
	for(int i=1;i<=n;i++)
	{
		op=read(),x=read();
		if(op==1)insert(root,x);
		if(op==2)del(root,x);
		if(op==3)printf("%d\n",RTN(root,x)+1);
		if(op==4)printf("%d\n",NTR(root,x));
		if(op==5)printf("%d\n",qq(root,x));
		if(op==6)printf("%d\n",hq(root,x));
	}
	return 0;	
} 
void push_up(int p)//√ 
{
	size(p)=size(ls(p))+size(rs(p))+1;
}
int _rand()//√ 
{
	srand(time(0));
	return rand();
}
void newnode(int p)//√ 
{
	cnt++;
	val(cnt)=p;
	size(cnt)=1;
	rnd(cnt)=_rand();
}
void merge(int &rt,int x,int y)//√ 
{
	if(x==0||y==0)
	{
		rt=x+y;
		return ;
	}
	if(rnd(x)<=rnd(y))
	{
		rt=x;
		merge(rs(rt),rs(x),y);
	}	
	else{
		rt=y;
		merge(ls(rt),x,ls(y));
	}	
	push_up(rt);
}
void split(int rt,int k,int &x,int &y)//√ 
{
	if(rt==0)
	{
		x=0;
		y=0;
		return ;
	}
	if(val(rt)<=k)
	{
		x=rt;
		split(rs(rt),k,rs(x),y);
	}
	else 
	{
		y=rt;
		split(ls(rt),k,x,ls(y));
	}
	push_up(rt);
}
void del(int rt,int x)//√ 
{
	int px=0,py=0,pz=0;	
	split(rt,x,px,py);
	split(px,x-1,px,pz);
	merge(pz,ls(pz),rs(pz));
	merge(px,px,pz);
	merge(rt,px,py);
} 
void insert(int rt,int val)//√ 
{
	int px=0,py=0,pz=0;	
	newnode(val);
	split(rt,val,px,py);
	merge(px,px,cnt);
	merge(rt,px,py);	
}
int RTN(int rt,int k)//√ 
{
	int x=0,y=0,jg=0;
	split(rt,k-1,x,y);
	jg=size(x);
	merge(rt,x,y);
	return jg;
}
int NTR(int rt,int k)
{    
    if(size(ls(rt))+1==k) return val(rt);
	if(size(ls(rt))>=k) return NTR(ls(rt),k); 
    else return NTR(rs(rt),k-size(ls(rt))-1);
}
int qq(int rt,int x)
{
	int px=0,py=0,jg=0;
	split(rt,x-1,px,py);
	jg=NTR(px,size(px));
	merge(rt,px,py);
	return jg;
} 
int hq(int rt,int x)
{
	int px=0,py=0,jg=0;
	split(rt,x,px,py);
	jg=NTR(py,1);
	merge(rt,px,py);
	return jg;
}
2025/1/25 15:16
加载中...