WA+MLE求助 :玄关
查看原帖
WA+MLE求助 :玄关
936204
Ace2012楼主2024/3/24 20:56
#include <bits/stdc++.h>
using namespace std;
//typedef long long q;
const int N=1e5;
struct node{
	int key,pri;
	int ls,rs;
	int size;
}t[N];

int cnt,root;

void newnode(int x){
	t[++cnt].key=x,t[cnt].pri=rand();
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].size=1;
}

void update(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}

void Split(int u,int x,int& L,int& R){
	if(u==0){
		L=R=0;
		return;
	}
	if(t[u].key<=x){
		L=u;
		Split(t[u].rs,x,t[u].rs,R);
	}
	else{
		R=u;
		Split(t[u].ls,x,L,t[u].ls);
	}
	update(u);
}
int Merge(int L,int R){
	if(L==0||R==0)return L+R;
	if(t[L].pri>t[R].pri){
		t[L].rs=Merge(t[L].rs,R);
		update(L);
		return L;
	}
	else{
		t[R].ls=(L,t[R].ls);
		update(R);
		return R;
	}
}



void insert(int x){
	int L,R;
	Split(root,x,L,R);
	newnode(x);
	root=Merge(Merge(L,cnt),R);
}

void del(int x){
	int L,R,p;
	Split(root,x,L,R);
	Split(L,x-1,L,p);
	p=Merge(t[p].ls,t[p].rs);
	root=Merge(Merge(L,p),R);
}

void Rank(int x){
	int L,R;
	Split(root,x-1,L,R);
	printf("%d\n",t[L].size+1);
	root=Merge(L,R);
}

int kth(int u,int k){
	if(k==t[t[u].ls].size+1)return u;
	else if(k>t[t[u].ls].size) return kth(t[u].rs,k-(t[t[u].ls].size+1));
	else kth(t[u].ls,k);
}

void pre(int x){
	int L,R;
	Split(root,x-1,L,R);
	printf("%d\n",t[kth(L,t[L].size)].key);
	root=Merge(L,R);
}

void nxt(int x){
	int L,R;
	Split(root,x,L,R);
	printf("%d\n",t[kth(R,1)].key);
	root=Merge(L,R);
}
int main(){
	srand(time(0));
	int n;
	cin>>n;
	while(n--){
		int opt,x;
		cin>>opt>>x;
		switch(opt){
			case 1:insert(x);break;
			case 2:del(x);break;
			case 3:Rank(x);break;
			case 4:printf("%d\n",t[kth(root,x)].key);break;
			case 5:pre(x);break;
			case 6:nxt(x);break;
		}
	}
	return 0;
}

时不时0分,7分,14分,28分

2024/3/24 20:56
加载中...