fhq treap wa8-12 玄关求调
查看原帖
fhq treap wa8-12 玄关求调
1163890
sjzsd147楼主2024/6/23 15:29
#include<bits/stdc++.h>
#define MAXN 100005
#define INF 0x3f3f3f3f
using namespace std;
int n,endnode,rt,outputk;
default_random_engine rnd;
struct node{
	int val,cnt;
	int ls,rs;
	int siz,lev;
	void clear(){
		val=cnt=ls=rs=siz=0;
		lev=rnd();
	}
}treap[MAXN];
vector<int>rubbish;
int new_node(){
	int nnode=0;
	if(rubbish.empty()){
		nnode=++endnode;
	}else{
		nnode=rubbish.back();
		rubbish.pop_back();
	}
	treap[nnode].clear();
	return nnode;
}
void delete_node(int &p){
	rubbish.push_back(p);
	treap[p].clear();
	p=0;
}
void push_up(int p){
	treap[p].siz=treap[treap[p].ls].siz+treap[treap[p].rs].siz+treap[p].cnt;
}
void split(int p,int v,int &x,int &y){
	if(p==0){
		x=y=0;
		push_up(p);
		return;
	}
	if(treap[p].val<=v){
		x=p;
		split(treap[p].rs,v,treap[p].rs,y);
	}else{
		y=p;
		split(treap[p].ls,v,x,treap[p].ls);
	}
	push_up(p);
}
int merge(int x,int y){
	if(x==0||y==0){
		push_up(x+y);
		return x+y;
	}
	if(treap[x].lev<treap[y].lev){
		treap[x].rs=merge(treap[x].rs,y);
		push_up(x);
		return x;
	}else{
		treap[y].ls=merge(x,treap[y].ls);
		push_up(y);
		return y;
	}
}
void insert(int v){
	int x,y,z;
	split(rt,v,x,z);
	split(x,v-1,x,y);
	if(y==0){
		y=new_node();
		treap[y].val=v;
	}
	treap[y].cnt++;
	push_up(y);
	rt=merge(merge(x,y),z);
}
void erase(int v){
	int x,y,z;
	split(rt,v,x,z);
	split(x,v-1,x,y);
	if(treap[y].cnt<=1) delete_node(y);
	rt=merge(merge(x,y),z);
}
int treap_rank(int v){
	int x,y;
	split(rt,v-1,x,y);
	int tmp=treap[x].siz+1;
	rt=merge(x,y);
	return tmp;
}
int kth(int p,int x){
	if(treap[treap[p].ls].siz>=x){
		return kth(treap[p].ls,x);
	}else if(treap[treap[p].ls].siz+treap[p].cnt>=x){
		return treap[p].val;
	}else{
		return kth(treap[p].rs,x-treap[treap[p].ls].siz-treap[p].cnt);
	}
}
int count(int v){
	int x,y,z;
	split(rt,v,x,z);
	split(x,v-1,x,y);
	int tmp=treap[y].siz;
	rt=merge(merge(x,y),z);
	return tmp;
}
int back(int v){
	int x,y;
	split(rt,v,x,y);
	int tmp=treap[x].siz;
	rt=merge(x,y);
	return kth(rt,tmp+1);
}
int main(){
	rnd.seed(114514);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	int opt,x;
	for(int i=1;i<=n;i++){
		cin>>opt>>x;
		if(opt==1){
			insert(x);
		}else if(opt==2){
			erase(x);
		}else if(opt==3){
			cout<<treap_rank(x)<<'\n';
		}else if(opt==4){
			cout<<kth(rt,x)<<'\n';
		}else if(opt==5){
			cout<<kth(rt,treap_rank(x)-1)<<'\n';
		}else if(opt==6){
			cout<<back(x)<<'\n';
		}
	}
	return 0;
}

提交记录

2024/6/23 15:29
加载中...