求助平衡树板子RE。
查看原帖
求助平衡树板子RE。
239832
sipu6174楼主2020/11/20 17:15

rt,已去掉行末空格与结尾回车。

#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
mt19937 rnd(time(0));
int read(){
   int s=0,f=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*f;
}
int T,n,a[N];
struct tree{
	int rnk,siz,ls,rs,val;
}t[N];
int root=1,tot;
int add_node(int val){
	t[++tot].val=val;
	t[tot].siz=1;
	t[tot].rnk=rnd();
	return tot;
}
inline void update(int x){t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;}
void merge(int &rt,int a,int b){
	if(!a||!b) {rt=a+b;return;}
	if(t[a].rnk<t[b].rnk){
		rt=a;
		merge(t[a].rs,t[a].rs,b);
	}else{
		rt=b;
		merge(t[b].ls,a,t[b].ls);
	}update(rt);
}
void split(int rt,int &a,int &b,int val){
	if(rt==0){a=b=0;return;}
	if(t[rt].val<=val){
		a=rt;
		split(t[a].rs,t[a].rs,b,val);
	}else{
		b=rt;
		split(t[b].ls,a,t[b].ls,val);
	}update(rt);
}
void insert(int &rt,int val){
	int x=0,y=0,newnode=add_node(val);
	split(rt,x,y,val);
	merge(x,x,newnode);
	merge(rt,x,y);
}
void Delete(int &rt,int val){
	int x=0,y=0,z=0;
	split(rt,x,y,val);
	split(x,x,z,val-1);
	merge(z,t[z].ls,t[z].rs);
	merge(x,x,z);
	merge(rt,x,y);
}
int getkth(int rt,int k){
	while(t[t[rt].ls].siz+1!=k){
		if(t[t[rt].ls].siz>=k) rt=t[rt].ls;
		else k-=t[t[rt].ls].siz+1,rt=t[rt].rs;
	}
	return t[rt].val;	
}
int getrnk(int &rt,int val){
	int x=0,y=0;
	split(rt,x,y,val-1);
	int tmp=t[x].siz+1;
	merge(rt,x,y);
	return tmp;
}
int getpre(int &rt,int val){
	int x=0,y=0;
	split(rt,x,y,val-1);
	int tmp=getkth(x,t[x].siz);
	merge(rt,x,y);
	return tmp;
}
int getnxt(int &rt,int val){
	int x=0,y=0;
	split(rt,x,y,val);
	int tmp=getkth(y,1);
	merge(rt,x,y);
	return tmp;
}
int main(){
   add_node(0x3f3f3f3f);
   tot=1; t[1].siz=0;
   T=read();
   while(T--){
      n=read();
      for(int i=1;i<=n;i++) insert(root,i);
      for(int i=1;i<=n;i++){
         int t=getkth(root,read()+1);
         printf("%d",t);
         if(i!=n) printf(" ");
         Delete(root,t);
      }
      if(T!=0) puts("");
   }
   return 0;
}
2020/11/20 17:15
加载中...