萌新救助Treap,0pts
查看原帖
萌新救助Treap,0pts
626463
Calvin_Wang楼主2024/1/17 19:45

RT

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int N=80010,INF=LLONG_MAX,MOD=1e6;
struct Treap_pet{
	int l,r,key,val;
}tr_pet[N]; 
int n,root_pet,idx_pet;

int get_node_pet(int key){
	tr_pet[++idx_pet].key=key;
	tr_pet[idx_pet].val=rand();
	return idx_pet;
}

void build_pet(){
	get_node_pet(-INF);
	get_node_pet(INF);
	root_pet=1;
	tr_pet[1].r=2;
}

void rotate_right_pet(int &p){
	int q=tr_pet[p].l;
	tr_pet[p].l=tr_pet[q].r;
	tr_pet[q].r=p;
	p=q;
}

void rotate_left_pet(int &p){
	int q=tr_pet[p].r;
	tr_pet[p].r=tr_pet[q].l;
	tr_pet[q].l=p;
	p=q;
}

void insert_pet(int &p,int key){
	if(!p){
		p=get_node_pet(key);
	}else if(tr_pet[p].key>key){
		insert_pet(tr_pet[p].l,key);
		if(tr_pet[tr_pet[p].l].val>tr_pet[p].val){
			rotate_right_pet(p);
		}
	}else{
		insert_pet(tr_pet[p].r,key);
		if(tr_pet[tr_pet[p].r].val>tr_pet[p].val){
			rotate_left_pet(p);
		}
	}
}

void remove_pet(int &p,int key){
	if(!p){
		return;
	}
	if(tr_pet[p].key==key){
		if(tr_pet[p].l||tr_pet[p].r){
			if(!tr_pet[p].r||tr_pet[tr_pet[p].l].val>tr_pet[tr_pet[p].r].val){
				rotate_right_pet(p);
				remove_pet(tr_pet[p].r,key);
			}else{
				rotate_left_pet(p);
				remove_pet(tr_pet[p].l,key);
			}
		}else{
			p=0;
		}
	}else if(tr_pet[p].key>key){
		remove_pet(tr_pet[p].l,key);
	}else{
		remove_pet(tr_pet[p].r,key);
	}
}

int get_prev_pet(int &p,int key){
	if(!p){
		return -INF;
	}
	if(tr_pet[p].key>key){
		return get_prev_pet(tr_pet[p].l,key);
	}
	return max(tr_pet[p].key,get_prev_pet(tr_pet[p].r,key));
}

int get_next_pet(int &p,int key){
	if(!p){
		return INF;
	}
	if(tr_pet[p].key<key){
		return get_next_pet(tr_pet[p].r,key);
	}
	return min(tr_pet[p].key,get_next_pet(tr_pet[p].l,key));
}

struct Treap_human{
	int l,r,key,val;
}tr_human[N]; 
int root_human,idx_human;

int get_node_human(int key){
	tr_human[++idx_human].key=key;
	tr_human[idx_human].val=rand();
	return idx_human;
}

void build_human(){
	get_node_human(-INF);
	get_node_human(INF);
	root_human=1;
	tr_human[1].r=2;
}

void rotate_right_human(int &p){
	int q=tr_human[p].l;
	tr_human[p].l=tr_human[q].r;
	tr_human[q].r=p;
	p=q;
}

void rotate_left_human(int &p){
	int q=tr_human[p].r;
	tr_human[p].r=tr_human[q].l;
	tr_human[q].l=p;
	p=q;
}

void insert_human(int &p,int key){
	if(!p){
		p=get_node_human(key);
	}else if(tr_human[p].key>key){
		insert_human(tr_human[p].l,key);
		if(tr_human[tr_human[p].l].val>tr_human[p].val){
			rotate_right_human(p);
		}
	}else{
		insert_human(tr_human[p].r,key);
		if(tr_human[tr_human[p].r].val>tr_human[p].val){
			rotate_left_human(p);
		}
	}
}

void remove_human(int &p,int key){
	if(!p){
		return;
	}
	if(tr_human[p].key==key){
		if(tr_human[p].l||tr_human[p].r){
			if(!tr_human[p].r||tr_human[tr_human[p].l].val>tr_human[tr_human[p].r].val){
				rotate_right_human(p);
				remove_human(tr_human[p].r,key);
			}else{
				rotate_left_human(p);
				remove_human(tr_human[p].l,key);
			}
		}else{
			p=0;
		}
	}else if(tr_human[p].key>key){
		remove_human(tr_human[p].l,key);
	}else{
		remove_human(tr_human[p].r,key);
	}
}

int get_prev_human(int &p,int key){
	if(!p){
		return -INF;
	}
	if(tr_human[p].key>key){
		return get_prev_human(tr_human[p].l,key);
	}
	return max(tr_human[p].key,get_prev_human(tr_human[p].r,key));
}

int get_next_human(int &p,int key){
	if(!p){
		return INF;
	}
	if(tr_human[p].key<key){
		return get_next_human(tr_human[p].r,key);
	}
	return min(tr_human[p].key,get_next_human(tr_human[p].l,key));
}

int cnt_pet,cnt_human,ans;

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	build_pet();
	build_human();
	cin>>n;
	while(n--){
		int opt,x;
		cin>>opt>>x;
		if(opt==0){
			if(cnt_human){
				int a=get_prev_human(root_human,x),b=get_next_human(root_human,x);
				if(abs(x-a)<=abs(x-b)){
					ans+=abs(x-a);
					ans%=MOD;
					remove_human(root_human,a);
					cnt_human--;
				}else{
					ans+=abs(x-b);
					ans%=MOD;
					remove_human(root_human,b);
					cnt_human--;
				}
			}else{
				insert_pet(root_pet,x);
				cnt_pet++; 
			}
		}else{
			if(cnt_pet){
				int a=get_prev_pet(root_pet,x),b=get_next_pet(root_pet,x);
				if(abs(x-a)<=abs(x-b)){
					ans+=abs(x-a);
					ans%=MOD;
					remove_pet(root_pet,a);
					cnt_pet--;
				}else{
					ans+=abs(x-b);
					ans%=MOD;
					remove_pet(root_pet,b);
					cnt_pet--;
				}
			}else{
				insert_pet(root_human,x);
				cnt_human++; 
			}
		}
	}
	cout<<ans%MOD;
	return 0;
}
2024/1/17 19:45
加载中...