求助FHQ Treap
查看原帖
求助FHQ Treap
314889
Goldenglow楼主2021/1/19 15:05

RT,过不了样例

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
	x=0;bool f=false;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=25000005;
const int INF=2147483647;
int siz[N],key[N],val[N],rs[N],ls[N],cnt,root[N],n; 
#define update(x) siz[x]=siz[ls[x]]+siz[rs[x]]+1
inline void copynode(int x,int now){siz[x]=siz[now],ls[x]=ls[now],rs[x]=rs[now],key[x]=key[now],val[x]=val[now];return ;}
inline int newnode(int x){siz[++cnt]=1,key[cnt]=rand(),val[cnt]=x;return cnt;}
void split(int now,int k,int &x,int &y){
	if(!now){x=y=0;return ;}
	if(val[now]<=k){x=++cnt;copynode(x,now);split(rs[x],k,rs[x],y);update(x);}
	else{y=++cnt;copynode(y,now);split(ls[y],k,x,ls[y]);update(y);}
	return ;
}
int merge(int x,int y){
	if(!x||!y) return x|y;
	int now=++cnt;
	if(key[x]<key[y]){copynode(now,x);rs[now]=merge(rs[now],y);}
	else{copynode(now,y);ls[now]=merge(x,ls[now]);}
	update(now);return now;
}
void insert(int &rt,int k){
	int x,y;split(rt,k,x,y);
	rt=merge(merge(x,newnode(k)),y);
	return ;
}
void mydelete(int &rt,int k){
	int x,y,z;
	split(rt,k,x,z),split(x,k-1,x,y);
	y=merge(ls[y],rs[y]),rt=merge(merge(x,y),z);
	return ;
}
int getrank(int &rt,int k){
	int x,y,ans;
	split(rt,k-1,x,y),ans=siz[x]+1;
	rt=merge(x,y);
	return ans;
}
int getval(int &rt,int k){
	int now=rt;
	while(1){
		if(siz[ls[now]]+1==k) return val[now];
		else if(siz[ls[now]]+1>=k) now=ls[now];
		else k-=siz[ls[now]]+1,now=rs[now];
	}
	return val[now];
}
int getpre(int &rt,int k){
	int x,y,now;split(rt,k-1,x,y);now=x;
	while(rs[now]) now=rs[now];
	rt=merge(x,y);
	return val[now];
}
int getnex(int &rt,int k){
	int x,y,now;split(rt,k,x,y);now=y;
	while(ls[now]) now=ls[now];
	rt=merge(x,y);
	return val[now];
}
int main(){
	read(n);insert(root[0],-INF),insert(root[0],INF);
	for(int i=1,op,val,type;i<=n;++i){
		read(type),read(op),read(val);
		root[i]=root[type];
		if(op==1){insert(root[i],val);}
		else if(op==2){mydelete(root[i],val);}
		else if(op==3){printf("%d\n",getrank(root[i],val));}
		else if(op==4){printf("%d\n",getval(root[i],val));}
		else if(op==5){printf("%d\n",getpre(root[i],val));}
		else if(op==6){printf("%d\n",getnex(root[i],val));}
	}
	system("Pause");
	return 0;
}

2021/1/19 15:05
加载中...