65pts Treap TLE求调
查看原帖
65pts Treap TLE求调
561833
DarkShadow楼主2025/7/18 18:27
#include <bits/stdc++.h>
#define l(x) d[x].lson
#define r(x) d[x].rson
using namespace std;
struct st{
	int siz,lson,rson,v,cnt,rnd;
};
st d[100005];
uniform_int_distribution<int> u;
mt19937 mt(chrono::system_clock().now().time_since_epoch().count());
namespace treap{
	int cnt;
	inline void zag(int &a){
		int t=r(a);
		r(a)=l(t),l(t)=a,d[t].siz=d[a].siz,d[a].siz=d[l(a)].siz+d[r(a)].siz+1,a=t;
	}
	inline void zig(int &a){
		int t=l(a);
		l(a)=r(t),r(t)=a,d[t].siz=d[a].siz,d[a].siz=d[l(a)].siz+d[r(a)].siz+1,a=t;
	}
	inline void insert(int &a,int v){
		if(a==0){
			a=++cnt,d[a].siz=d[a].cnt=1,d[a].v=v,d[a].rnd=u(mt);
			return ;
		}
		d[a].siz++;
		if(v==d[a].v){
			d[a].cnt++;
			return ;
		}
		if(v<d[a].v){
			insert(l(a),v);
			if(d[l(a)].rnd<d[a].rnd)  zig(a);
		}
		else{
			insert(r(a),v);
			if(d[r(a)].rnd<d[a].rnd)  zag(a);
		}
	}
	inline void remove(int &a,int v){
		if(v==d[a].v){
			if(d[a].cnt>1)  d[a].cnt--,d[a].siz--;
			else if(l(a)==0||r(a)==0)  a=l(a)+r(a);
			else if(d[l(a)].rnd<d[r(a)].rnd){
				zig(a);
				remove(a,v);
			}
			else{
				zag(a);
				remove(a,v);
			}
			return ;
		}
		d[a].siz--;
		if(v<d[a].v)  remove(l(a),v);
		if(v>d[a].v)  remove(r(a),v);
	}
	inline int rank(int a,int v){
		if(a==0)  return 0;
		if(v<=d[a].v)  return rank(l(a),v);
		return d[l(a)].siz+d[a].cnt+rank(r(a),v);
	}
	inline int query(int a,int b){
		if(b<=d[l(a)].siz)  return query(l(a),b);
		if(b<=d[l(a)].siz+d[a].cnt)  return d[a].v;
		return query(r(a),b-d[l(a)].siz-d[a].cnt);
	}
	inline int pre(int a,int v){
		int ans=-0x7fffffff;
		while(a){
			if(v>d[a].v)  ans=d[a].v,a=r(a);
			else  a=l(a);
		}
		return ans;
	}
	inline int nxt(int a,int v){
		int ans=0x7fffffff;
		while(a){
			if(v<d[a].v)  ans=d[a].v,a=l(a);
			else  a=r(a);
		}
		return ans;
	}
}
int main(){
	int n,opt,x,rt=0;
	int t;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&opt,&x);
		if(opt==1)  treap::insert(rt,x);
		if(opt==2)  treap::remove(rt,x);
		if(opt==3)  printf("%d\n",treap::rank(rt,x)+1);
		if(opt==4)  printf("%d\n",treap::query(rt,x));
		if(opt==5)  printf("%d\n",treap::pre(rt,x));
		if(opt==6)  printf("%d\n",treap::nxt(rt,x));
	}
	return 0;
}
2025/7/18 18:27
加载中...