FHQ80分求助
查看原帖
FHQ80分求助
572956
wuhaoran2012楼主2025/6/14 21:19
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
struct node{
	node *ls,*rs;
	int val,del,siz,rnd;
	node(int _val):val(_val),del(1),siz(1),rnd(rand()){ls=rs=nullptr;}
	void push_up(){siz=del+(ls?ls->siz:0)+(rs?rs->siz:0);}
	node(){;}
};
node *root,*rt[N];
node *copy(node *p){node *rot=new node;*rot=*p;return rot;}
pair<node*,node*>split(node *p,int k){
	if(p==nullptr) return {nullptr,nullptr};
	p=copy(p);
	if(p->val<=k){
		auto temp=split(p->rs,k);
		p->rs=temp.first;
		p->push_up();
		return {p,temp.second};
	}
	if(k<p->val){
		auto temp=split(p->ls,k);
		p->ls=temp.second;
		p->push_up();
		return {temp.first,p};
	}
}	
tuple<node*,node*,node*>split_by_rank(node *p,int k){
	if(p==nullptr) return {nullptr,nullptr,nullptr};
	p=copy(p);
	int lsiz=(p->ls?p->ls->siz:0);
	if(k<=lsiz){
		node *l,*mid,*r;
		tie(l,mid,r)=split_by_rank(p->ls,k);
		p->ls=r;
		p->push_up();
		return {l,mid,p};
	}
	if(lsiz<k&&k<=lsiz+p->del){
		node *l=p->ls;
		node *r=p->rs;
		p->ls=p->rs=nullptr;
		p->push_up();
		return {l,p,r};
	}
	if(lsiz+p->del<k){
		node *l,*mid,*r;
		tie(l,mid,r)=split_by_rank(p->rs,k-lsiz-p->del);
		p->rs=l;
		p->push_up();
		return {p,mid,r};
	}
}
node *merge(node *n,node *m){
	if(n==nullptr&&m==nullptr) return nullptr;
	if(n==nullptr) return m;
	if(m==nullptr) return n;
	if(n->rnd<m->rnd){
		node *p=copy(n);
		p->rs=merge(p->rs,m);
		p->push_up();
		return p;
	}else{
		node *p=copy(m);
		p->ls=merge(n,p->ls);
		p->push_up();
		return p;
	}
}
void insert(int k){
	auto temp=split(root,k);
	auto t_l=split(temp.first,k-1);
	if(t_l.second) temp.second->del++,temp.second->push_up();
	else t_l.second=new node(k);
	root=merge(merge(t_l.first,t_l.second),temp.second);
}
void erase(int k){
	auto temp=split(root,k);
	auto t_l=split(temp.first,k-1);
	if(t_l.second==nullptr){root=merge(merge(t_l.first,t_l.second),temp.second);return;}
	if(t_l.second->del>1){
		t_l.second->del--;
		t_l.second->push_up();
		t_l.first=merge(t_l.first,t_l.second);
	}else{
		if(t_l.second==temp.first) temp.first=nullptr;
		delete t_l.second;
		t_l.second=nullptr;
	}
	root=merge(t_l.first,temp.second);
}
int qval(node *p,int k){
	node *l,*mid,*r;tie(l,mid,r)=split_by_rank(p,k);
	int ans=mid?mid->val:-INT_MAX;
	p=merge(merge(l,mid),r);
	return ans;
}
int qrank(node *p,int k){
	auto temp=split(p,k-1);
	int ans=(temp.first?temp.first->siz:0)+1;
	p=merge(temp.first,temp.second);
	return ans;
}
int qpre(int k){
	auto temp=split(root,k-1);
	int ans=qval(temp.first,temp.first?temp.first->siz:0);
	root=merge(temp.first,temp.second);
	return ans;
}
int qnxt(int k){
	auto temp=split(root,k);
	int ans=qval(temp.second,1);
	root=merge(temp.first,temp.second);
	return (ans==-INT_MAX?INT_MAX:ans);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		int v,opt,x;cin>>v>>opt>>x;
		root=rt[v];
		if(opt==1) insert(x);
		if(opt==2) erase(x);
		if(opt==3) cout<<qrank(root,x)<<'\n';
		if(opt==4) cout<<qval(root,x)<<'\n';
		if(opt==5) cout<<qpre(x)<<'\n';
		if(opt==6) cout<<qnxt(x)<<'\n';
		rt[i]=root;
	}
	return 0;
}

悬关

2025/6/14 21:19
加载中...