Treap求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/2 11:15
  • 上次更新2023/11/2 23:57:09
查看原帖
Treap求调
895435
Zq_water楼主2023/9/2 11:15

P3369,7分

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;

int n,rt,cnt;
struct Treap{
	int lch,rch,val,pri,cnt,siz;
}tr[maxn<<3];

int add(int x){
	tr[++cnt]={0,0,x,rand(),1,1};
	return cnt;
}

void push_up(int u){
	tr[u].siz=tr[tr[u].lch].siz+tr[tr[u].rch].siz+tr[u].cnt;
}

void zig(int &u){
	int v=tr[u].lch;
	tr[u].lch=tr[v].rch;
	tr[v].rch=u;
	tr[v].siz=tr[u].siz;
	push_up(u);
	u=v;
}

void zag(int &u){
	int v=tr[u].rch;
	tr[u].rch=tr[v].lch;
	tr[v].lch=u;
	tr[v].siz=tr[u].siz;
	push_up(u);
	u=v;
}

void insert(int &u,int k){
	if(!u){
		u=add(k);
		return;
	}
	tr[u].siz++;
	if(tr[u].val==k){
		tr[u].cnt++;
		return;
	}
	else{
		if(k<tr[u].val){
			insert(tr[u].lch,k);
			if(tr[u].pri<tr[tr[u].lch].pri) zig(u);
		}
		else{
			insert(tr[u].rch,k);
			if(tr[u].pri<tr[tr[u].rch].pri) zag(u);
		}
	}
	push_up(u);
}

void del(int &u,int k){
	if(!u) return;
	tr[u].siz--;
	if(k==tr[u].val){
		if(tr[u].cnt>1){
			tr[u].cnt--;
			return;
		}
		if(!tr[u].lch||!tr[u].rch) u=tr[u].lch+tr[u].rch;
		else if(tr[tr[u].lch].pri>tr[tr[u].rch].pri){
			zig(u);
			del(tr[u].rch,k);
		}
		else{
			zag(u);
			del(tr[u].lch,k);
		}
		return;
	}
	if(k<tr[u].val) del(tr[u].lch,k);
	else del(tr[u].rch,k);
	push_up(u); 
}

int pre(int u,int x){
	if(!u) return -2e9;
	if(x<=tr[u].val) return pre(tr[u].lch,x);
	else return max(tr[u].val,pre(tr[u].rch,x)); 
}

int nxt(int u,int x){
    if(!u) return 2e9;
    if(x>=tr[u].val) return nxt(tr[u].rch,x);
    else return min(tr[u].val,nxt(tr[u].lch,x));
}

int Val_to_Rank(int u,int k){
	if(!u) return 0;
	if(tr[u].val==k) return tr[tr[u].lch].siz+1; 
	if(k<tr[u].val) return Val_to_Rank(tr[u].lch,k);
	else return Val_to_Rank(tr[u].rch,k);
}

int Rank_to_Val(int u,int k){
	if(!u) return 0;
	if(tr[tr[u].lch].siz>=k) return Rank_to_Val(tr[u].lch,k);
	if(tr[tr[u].lch].siz+tr[u].cnt>=k) return tr[u].val;
	return Rank_to_Val(tr[u].rch,k-tr[tr[u].lch].siz-tr[u].cnt);
}

int main(){
	scanf("%d",&n);
	for(int i=1,op,x;i<=n;i++){
		scanf("%d %d",&op,&x);
		if(op==1) insert(rt,x);
		else if(op==2) del(rt,x);
		else if(op==3) printf("%d\n",Val_to_Rank(rt,x)+1);
		else if(op==4) printf("%d\n",Rank_to_Val(rt,x));
		else if(op==5) printf("%d\n",pre(rt,x));
		else if(op==6) printf("%d\n",nxt(rt,x));
	}
	
	return 0;
}//Zq_water

hack数据:

4
1 10
1 30
1 20
3 21
2023/9/2 11:15
加载中...