求助!玄关
查看原帖
求助!玄关
758200
_LDX_WWS_楼主2024/8/1 20:53

初学Treap,30pts显示MLE

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
struct node{
	int ls,rs,size,w,pri;
};
node t[N];
int T,cnt;
void build(int x){
	int u=++cnt;
	t[u].w=x;t[u].ls=t[u].rs=0;t[u].size=1;t[u].pri=rand();
}
void up(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void leftr(int &u){		//left round
	int k;
	k=t[u].rs;
	t[u].rs=t[k].ls;
	t[k].ls=u;
	t[k].size=t[u].size;
	up(u);
	u=k;
}
void rightr(int &u){		//right round
	int k;
	k=t[u].ls;
	t[u].ls=t[k].rs;
	t[k].rs=u;
	t[k].size=t[u].size;
	up(u);
	u=k;
}
void insert(int &u,int x){
	if(u==0){
		build(x);u=cnt;return;
	}
	t[u].size++;
	if(x>=t[u].w) insert(t[u].rs,x);
	else insert(t[u].ls,x);
	if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) rightr(u);
	if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) leftr(u);
}
void del(int &u,int x){
	t[u].size--;
	if(t[u].w==x){
		u=0;
		if(t[u].ls==0&&t[u].rs==0) return;
		if(t[u].ls==0||t[u].rs==0){
			u=t[u].ls+t[u].rs;
			return;
		}
		if(t[t[u].ls].pri<t[t[u].rs].pri){
			rightr(u);
			del(t[u].rs,x);
			return;
		}
		else{
			leftr(u);
			del(t[u].ls,x);
			return;
		}
	}
	if(t[u].w<x) del(t[u].ls,x);
	else del(t[u].rs,x);
	up(u); 
}
int rank1(int u,int x){
	if(u==0) return 0;
	if(x>t[u].w) return (t[t[u].ls].size+1+rank1(t[u].rs,x));
	else return rank1(t[u].ls,x);
}
int ask(int u,int k){
	//cout<<u<<endl;
	if(k==t[t[u].ls].size+1) return t[u].w;
	if(k>t[t[u].ls].size+1) return ask(t[u].rs,k-(t[t[u].ls].size+1));
	else return ask(t[u].ls,k);
}
int front(int u,int x){
	if(u==0) return 0;
	if(t[u].w>=x){
		return front(t[u].ls,x);
	}
	int tmp=max(t[u].w,front(t[u].rs,x));
	return tmp;
}
int back(int u,int x){
	if(u==0) return INT_MAX;
	if(t[u].w<=x){
		return back(t[u].rs,x);
	}
	int tmp=min(t[u].w,back(t[u].ls,x));
	return tmp;
}
int main(){
	cin>>T;
	int root=0;
	while(T--){
		int opt,x;
		cin>>opt>>x;
		 //cout<<"root"<<root<<endl;
		switch (opt){
			case 1 : insert(root,x); break;
			case 2 : del(root,x); break;
			case 3 : {
				cout<<rank1(root,x)+1<<endl;
				break;
			} 
			case 4 : {
				cout<<ask(root,x)<<endl;
				break;
			}
			case 5 : {
				cout<<front(root,x)<<endl;
				break;
			}
			case 6 : {
				cout<<back(root,x)<<endl;
				break;
			}
		}
	}
	return 0;
} 
2024/8/1 20:53
加载中...