悬3关,MnZn刚学FHQ样例没过求出
查看原帖
悬3关,MnZn刚学FHQ样例没过求出
782941
_O_v_O_楼主2024/4/19 10:11
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(x) tr[x].lson
#define rs(x) tr[x].rson

const int N=1e5+5;
int n,op,x;
struct fhq{
	struct node{int lson,rson;int val,pri;int siz;};
	int root,cnt;node tr[N];
	void pushup(int x){tr[x].siz=tr[ls(x)].siz+tr[rs(x)].siz+1;}
	int newnode(int x){tr[++cnt]={0,0,x,rand(),1};return cnt;}
	void split(int u,int v,int &x,int &y){
		if(!u){x=y=0;return;}
		if(tr[u].val<=v) x=u,split(rs(u),v,rs(u),y);
		else y=u,split(ls(u),v,x,ls(u));
	}
	int merge(int x,int y){
		if(!x||!y) return x+y;
		if(tr[x].pri<tr[y].pri){rs(x)=merge(rs(x),y);pushup(x);return x;}
		else{ls(x)=merge(x,ls(y));pushup(y);return y;}
	}
	int kth(int u,int k){
		while(1){
			if(k==tr[ls(u)].siz+1) return u;
			if(k<=tr[ls(u)].siz) u=ls((u));
			else k-=tr[ls(u)].siz+1,u=rs(u);
		}
	}
	void ins(int v){
		int x,y,z=newnode(v);split(root,v,x,y);
		root=merge(merge(x,z),y);
	}
	void del(int v){
		int x,y,z;split(root,v,x,z),split(x,v-1,x,y);
		y=merge(ls(y),rs(y)),root=merge(merge(x,y),z);
	}
	int rnk(int v){
		int x,y,t;split(root,v-1,x,y);
		t=tr[x].siz+1,root=merge(x,y);return t;
	}
	int pre(int v){
		int x,y,t;split(root,v-1,x,y);
		t=kth(x,tr[x].siz),root=merge(x,y);return t;
	}
	int suf(int v){
		int x,y,t;split(root,v-1,x,y);
		t=kth(y,1),root=merge(x,y);return t;
	}
};
fhq tr;

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n;
	while(n--){
		cin>>op>>x;
		if(op==1) tr.ins(x);
		if(op==2) tr.del(x);
		if(op==3) cout<<tr.rnk(x)<<endl;
		if(op==4) cout<<tr.tr[tr.kth(tr.root,x)].val<<endl;
		if(op==5) cout<<tr.tr[tr.pre(x)].val<<endl;
		if(op==6) cout<<tr.tr[tr.suf(x)].val<<endl;
	}
	return 0;
}
2024/4/19 10:11
加载中...