注意看,这个男人叫小帅,被fhq-Treap拦住了
查看原帖
注意看,这个男人叫小帅,被fhq-Treap拦住了
739250
Smi1EMAsk楼主2023/3/20 21:12

评测记录

//OOOOOOOOOOOOOOOOrz
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int num=0,sign=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
	return num*sign;
}
const int N=1e5+7;
struct Treap{
	int ls,rs,siz,val,key;
}t[N];
int root,node;
mt19937 rnd(233);
int new_node(int x){
	t[++node]={0,0,1,x,rnd()};
	return node;
}
void pushup(int id){
	t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;
}
void split(int now,int val,int &x,int &y){
	if(!now) return x=y=0,void();
	if(t[now].val<=val) x=now,split(t[now].rs,val,t[now].rs,y);
	else y=now,split(t[now].ls,val,x,t[now].ls);
	pushup(now);
}
int merge(int x,int y){
	if(!x||!y) return x^y;
	if(t[x].key>t[y].key){
		t[x].rs=merge(t[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		t[y].ls=merge(x,t[y].ls);
		pushup(y);
		return y;
	}
}
void insert(int val){
	int x,y;
	split(root,val,x,y);
	root=merge(merge(x,new_node(val)),y);
}
void erase(int val){
	int x,y,z;
	split(root,val,x,y);
	split(root,val-1,x,z);
	z=merge(t[z].ls,t[z].rs);
	root=merge(merge(x,z),y);
}
int nlt(int val){
	int x,y;
	split(root,val-1,x,y);
	int ans=t[x].siz+1;
	root=merge(x,y);
	return ans;
}
int kth(int id,int k){
	if(t[t[id].ls].siz+1==k) return t[id].val;
	if(t[t[id].ls].siz>=k) return kth(t[id].ls,k);
	return kth(t[id].rs,k-t[t[id].ls].siz-1);
}
int pre(int x){
	return kth(root,nlt(x)-1);
}
int nxt(int x){
	return kth(root,nlt(x+1));
}
int main(){
	int T=rd();
	while(T--){
		int op=rd(),x=rd();
		if(op==1) insert(x);
		if(op==2) erase(x);
		if(op==3) printf("%d\n",nlt(x));
		if(op==4) printf("%d\n",kth(root,x));
		if(op==5) printf("%d\n",pre(x));
		if(op==6) printf("%d\n",nxt(x));
	}
	return 0;
}

有没有人帮帮小帅,把可恶的MLE答辩绳之以法

2023/3/20 21:12
加载中...