P3369求调
  • 板块灌水区
  • 楼主zky114514
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/3 07:07
  • 上次更新2024/8/3 07:07:48
查看原帖
P3369求调
1412685
zky114514楼主2024/8/3 07:07
#include<bits/stdc++.h>
using namespace std;
#define ls t[x].ch[0]
#define rs t[x].ch[1]
using namespace std;
int N=100001,cnt;
struct node {
	int ch[2],cnt,size,val,rd;
} t[100001];
void up(int x) {
	t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}
void rotate(int &x,int d) {
	int tem= t[x].ch[d];
	t[x].ch[d]=t[tem].ch[d^1];
	t[tem].ch[d^1]=x;
	up(x);
	up(tem);
	x=tem;
}
void insert(int &x,int val) {
	if(!x) {
		x=++cnt;
		t[x].cnt=t[x].size=1;
		t[x].val=val,t[x].rd=rand();
		return;
	}
	t[x].size++;
	if(t[x].val == val) {
		t[x].cnt++;
		return;
	}
	int d=t[x].val < val;
	insert(t[x].ch[d],val);
	if(t[x].rd > t[t[x].ch[d]].rd) rotate(x,d);
}
void delet(int &x,int val) {
	if(!x) return;
	if(t[x].val == val) {
		if(t[x].cnt > 1) {
			t[x].cnt--;
			t[x].size--;
			return;
		}
		bool d=t[ls].rd > t[rs].rd;
		if(ls == 0 || rs == 0) x=ls+rs;
		else rotate(x,d),delet(x,val);
	} else t[x].size--,delet(t[x].ch[t[x].val<val],val);
}
int kth(int root,int k) {
	int x=root;
	while(1) {
		if(k <= t[ls].size) x=ls;
		else if(k > t[ls].size+t[x].cnt)
			k -= t[ls].size+t[x].cnt,x=rs;
		else return t[x].val;
	}
}
int rnk(int x,int val) {
	if(!x) return 0;
	if(t[x].val == val) return t[ls].size+1;
	if(t[x].val>val)return rnk(ls,val);
	return rnk(rs,val)+t[ls].size+t[x].cnt;
}
int ans;
int pre(int x,int val) {
	if(!x)return 1;
	if(t[x].val<val) {
		ans=t[x].val;
		return pre(rs,val);
	}
	return pre(ls,val);
}
int nxt(int x,int val) {
	if(!x)return ans;
	if(t[x].val>val) {
		ans=t[x].val;
		return nxt(ls,val);
	}
	return nxt(rs,val);
}
int main(){
	int t,rt;
	cin>>t;
	while(t--){
		int op,x;
		cin>>op>>x;
		if(op==1)insert(rt,x);
		else if(op==2)delet(rt,x);
		else if(op==3)cout<<rnk(rt,x)<<"\n";
		else if(op==4)cout<<kth(rt,x)<<"\n";
		else if(op==5){
			ans=0;
			pre(rt,x);
			cout<<ans<<"\n";
		}
		else{
			ans=0;
			nxt(rt,x);
			cout<<ans<<"\n";
		}
	}
}
2024/8/3 07:07
加载中...