【悬关】37pts 求助
查看原帖
【悬关】37pts 求助
785639
xuchuhan楼主2024/7/2 14:37

RT。有 WA,TLE,MLE,AC。用的FHQ-Treap,救救孩子吧 OvO

记录如下

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,INF=1e9;
int tot,Root,T;
struct Treap{
	int val,siz,pri;
	int lc,rc;
}a[N];
void pushup(int cur){
	a[cur].siz=a[a[cur].lc].siz+a[a[cur].rc].siz+1;
	return;
}
void split(int rt,int k,int &x,int &y){
	if(!rt){
		x=y=0;
		return;
	}
	if(k<=a[a[rt].lc].siz){
		split(a[rt].lc,k,x,y);
		a[rt].lc=y;
		pushup(rt);
		y=rt;
	}
	else{
		split(a[rt].rc,k-a[a[rt].lc].siz-1,x,y);
		a[rt].rc=x;
		pushup(rt);
		x=rt;
	}
	return;
}
int merge(int x,int y){
	if(!x||!y)
		return x+y;
	if(a[x].pri<a[y].pri){
		a[x].rc=merge(a[x].rc,y);
		pushup(x);
		return x;
	}
	else{
		a[y].lc=merge(x,a[y].lc);
		pushup(y);
		return y;
	}
}
int Rank(int rt,int val){
	if(!rt)
		return 0;
	if(val<a[rt].val)
		return Rank(a[rt].lc,val);
	else
		return Rank(a[rt].rc,val)+a[a[rt].lc].siz+1;
}
void insert(int val){
	a[++tot].val=val,a[tot].pri=rand()%INF;
	a[tot].lc=a[tot].rc=0;
	a[tot].siz=1;
	int rk=Rank(Root,val);
	int x,y;
	split(Root,rk,x,y);
	Root=merge(merge(x,tot),y);
	return;
}
void delet(int val){
	int rk=Rank(Root,val);
	int obs,x,y,tmp;
	split(Root,rk,obs,y);
	split(Root,rk-1,x,tmp);
	Root=merge(x,y);
	return;
}
int getnum(int k){
	int x,y,z,num;
	split(Root,k,x,y);
	split(x,k-1,z,num);
	Root=merge(z,merge(num,y));
	return a[num].val;
}
signed main(){
	srand(time(0));
	cin>>T;
	while(T--){
		int op,x;
		cin>>op>>x;
		if(op==1)
			insert(x);
		else if(op==2)
			delet(x);
		else if(op==3)
			cout<<Rank(Root,x)<<"\n";
		else if(op==4)
			cout<<getnum(x)<<"\n";
		else if(op==5)
			cout<<getnum(Rank(Root,x-1))<<"\n";
		else
			cout<<getnum(Rank(Root,x)+1)<<"\n";
	}
	return 0;
}
2024/7/2 14:37
加载中...