WBLT求调 TLE+MLE
查看原帖
WBLT求调 TLE+MLE
1023698
zhuoheng楼主2025/7/28 15:01
#include<bits/stdc++.h>
using namespace std;
const double A=1.0-sqrt(2.0)/2;
struct node{
	int l,r,sz,c;
}t[200001];
int len,rt,sta[100001],tp;
inline int insert(int l,int r){
	int now=tp?sta[tp--]:++len;
	t[now].l=l,t[now].r=r,t[now].c=t[r].c;
	t[now].sz=t[l].sz+t[r].sz;
	return now;
}
inline void vclean(int x){sta[++tp]=x,t[x].l=t[x].r=t[x].sz=t[x].c=0;}
inline void vcopy(int x,int y){t[y]=t[x];}
inline int vnew(int c){
	int now=tp?sta[tp--]:++len;
	t[now].c=c,t[now].sz=1;
	return now;
}
inline void pushup(int x){
	int l=t[x].l,r=t[x].r;
	if(!t[l].sz)return;
	t[x].c=t[r].c,t[x].sz=t[l].sz+t[r].sz;
}
inline void rotate(int x,bool p){
	if(p){
		int l=t[x].l;
		t[x].r=insert(t[l].r,t[x].r);
		t[x].l=t[l].l,vclean(l); 
	}else{
		int r=t[x].r;
		t[x].l=insert(t[x].l,t[r].l);
		t[x].r=t[r].r,vclean(r); 
	}
}
inline bool ck(int x){return (double)min(t[t[x].l].sz,t[t[x].r].sz)>=A*(double)t[x].sz;}
inline void maintain(int x){
	if(ck(x))return;
	rotate(x,t[t[x].l].sz>t[t[x].r].sz);
}
inline void add(int now,int x){
	if(t[now].sz==1){
		t[now].l=vnew(min(t[now].c,x));
		t[now].r=vnew(max(t[now].c,x));
		pushup(now);return;
	}
	maintain(now);
	int l=t[now].l,r=t[now].r;
	if(x<=t[l].c)add(l,x);
	else add(r,x);
	pushup(now);
}
inline void del(int now,int fa,int x){
	if(t[now].sz==1){
		int x=(t[fa].l==now)?t[fa].r:t[fa].l;
		fa=x,vclean(now),vclean(x);
		return;
	}
	maintain(now);
	int l=t[now].l,r=t[now].r;
	if(x<=t[l].c)del(l,now,x);
	else del(r,now,x);
	pushup(now);
}
inline int findrk(int now,int x){
	if(t[now].sz==1)return 1;
	maintain(now);
	int l=t[now].l,r=t[now].r;
	if(x<=t[l].c)return findrk(l,x);
	else return t[l].sz+findrk(r,x);
}
inline int findshuz(int now,int k){
	if(t[now].sz==k)return t[now].c;
	maintain(now);
	int l=t[now].l,r=t[now].r;
	if(k<=t[l].sz)return findshuz(l,k);
	else return findshuz(r,k-t[l].sz);
}
int n;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n,rt=vnew(1<<30);
	while(n--){
		int op,x;
		cin>>op>>x;
		if(op==1)add(rt,x);
		if(op==2)del(rt,0,x);
		if(op==3)cout<<findrk(rt,x)<<'\n';
		if(op==4)cout<<findshuz(rt,x)<<'\n';
		if(op==5)cout<<findshuz(rt,findrk(rt,x)-1)<<'\n';
		if(op==6)cout<<findshuz(rt,findrk(rt,x+1))<<'\n';
	}
}

TLE+MLE最后只剩30pts

2025/7/28 15:01
加载中...