萌新刚学fhq__treap,MLE+TLE求调
查看原帖
萌新刚学fhq__treap,MLE+TLE求调
756529
progress_from0楼主2023/3/2 17:22
#include<bits/stdc++.h>

using namespace std;
const int maxn= 100010;
int n,tot,root;

struct Node{
	int ch[2],val;
	int pri,siz;
}t[maxn<<2];

int New_code(int x){
	t[++tot].siz=1;
	t[tot].val=x;
	t[tot].pri=rand();
	return tot;
}

inline void maintain(int x){
	t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+1;
}

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

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

inline void insert(int k){
	int x,y;
	split(root,k,x,y);
	root=merge(merge(x,New_code(k)),y);
}

inline void del(int k){
	int x,y,z;
	split(root,k,x,z);
	split(root,k-1,x,y);
	y=merge(t[y].ch[0],t[y].ch[1]);
	root=merge(merge(x,y),z);
}

inline int rnk(int k){
	int x,y,ans;
	split(root,k-1,x,y);
	ans=t[x].siz+1;
	root=merge(x,y);
	return ans;
}

inline int kth(int cur,int k){
	while(1){
		if(k<=t[t[cur].ch[0]].siz){
			cur=t[cur].ch[0];
		}
		else{
			k-=t[t[cur].ch[0]].siz+1;
			if(k<=0)
				return cur;
			cur=t[cur].ch[1];
		}
	}
}

inline int pre(int k){
	int x,y,ans;
	split(root,k-1,x,y);
	ans=t[kth(x,t[x].siz)].val;
	root=merge(x,y);
	return ans;
}

inline int nxt(int k){
	int x,y,ans;
	split(root,k,x,y);
	ans=t[kth(y,1)].val;
	root=merge(x,y);
	return ans;
}

int main(){
//	freopen("1.txt","r",stdin);
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++){
		int opt,x;
		cin>>opt>>x;
		switch(opt){
			case 1:{
				insert(x);
				break;
			}
			case 2:{
				del(x);
				break;
			}
			case 3:{
				cout<<rnk(x)<<endl;
				break;
			}
			case 4:{
				cout<<t[kth(root,x)].val<<endl;
				break;
			}
			case 5:{
				cout<<pre(x)<<endl;
				break;
			}
			case 6:{
				cout<<nxt(x)<<endl;
				break;
			}
		}
	}
	return 0;
} 
//t如果开1倍又能过一个点,同时MLE两个点
2023/3/2 17:22
加载中...