SGT求调
查看原帖
SGT求调
1109707
godmoo楼主2024/1/3 13:56
#include<bits/stdc++.h>
#define alpha 0.75
using namespace std;
const int N=1e5+5;
int n,tot,rt,dfn[N];
struct Node{int lc,rc,val,cnt,siz,sizc,sizd;}tree[N];
void pushup(int u){
	tree[u].siz=tree[tree[u].lc].siz+tree[tree[u].rc].siz+1;
	tree[u].sizc=tree[tree[u].lc].sizc+tree[tree[u].rc].sizc+tree[u].cnt;
	tree[u].sizd=tree[tree[u].lc].sizd+tree[tree[u].rc].sizd+(tree[u].cnt!=0);
}
bool check(int u){
//	cout<<alpha<<" "<<u<<" "<<tree[u].siz<<" "<<alpha*tree[u].siz<<" "<<1.0*max(tree[tree[u].lc].siz,tree[tree[u].rc].siz)<<endl;
	return tree[u].cnt&&(alpha*tree[u].siz<=1.0*max(tree[tree[u].lc].siz,tree[tree[u].rc].siz)||1.0*tree[u].sizd<=alpha*tree[u].siz);
}
void dfs(int u,int &cur){
	if(!u) return;
	dfs(tree[u].lc,cur);
	if(tree[u].cnt) dfn[++cur]=u;
	dfs(tree[u].rc,cur);
}
void build(int &u,int l,int r){
	if(l>r){
		u=0;
		return;
	}
	int mid=l+r>>1;
	u=dfn[mid];
	build(tree[u].lc,l,mid-1);
	build(tree[u].rc,mid+1,r);
	pushup(u);
}
void debug(int u);
void rebuild(int &u){
	if(check(u)){
//		puts("dfs"),debug(rt),puts("end");
		int cur=0;
		dfs(u,cur);
//		puts("cur:");
//		for(int i=1;i<=cur;i++) printf("%d ",dfn[i]);
//		puts("end");
		build(u,1,cur);
//		puts("rebuild dfs"),printf("u : %d\n",u),debug(rt),puts("end");
	}
}
int create(int w){
	tree[++tot]={0,0,w,1,1,1,1};
	return tot;
}
void insert(int &u,int w){
//	cout<<"at:"<<u<<endl;
	if(!u){
		u=create(w);
//		cout<<u<<endl;
		return;
	}
	if(tree[u].val==w) tree[u].cnt++;
	else if(tree[u].val>w) insert(tree[u].lc,w);
	else insert(tree[u].rc,w);
	pushup(u);
	rebuild(u);
}
void remove(int &u,int w){
	if(!u) return;
	if(tree[u].val==w&&tree[u].cnt) tree[u].cnt--;
	else if(tree[u].val>w) insert(tree[u].lc,w);
	else insert(tree[u].rc,w);
	pushup(u);
	rebuild(u);
}
int rnk(int u,int w){
	if(!u) return 0;
	if(tree[u].val==w&&tree[u].cnt) return tree[tree[u].lc].sizc;
	else if(tree[u].val>w) return rnk(tree[u].lc,w);
	else return tree[tree[u].lc].sizc+tree[u].cnt+rnk(tree[u].rc,w);
}
int kth(int u,int w){
	if(!u) return 0;
	if(tree[tree[u].lc].sizc<w&&w<=tree[tree[u].lc].sizc+tree[u].cnt) return tree[u].val;
	else if(w<=tree[tree[u].lc].sizc) return kth(tree[u].lc,w);
	else return kth(tree[u].rc,w-tree[tree[u].lc].sizc-tree[u].cnt);
}
int pre(int u,int w){return kth(rt,rnk(rt,w));}
int nxt(int u,int w){return kth(rt,rnk(rt,w)+2);}
void debug(int u){
//	cout<<"at:"<<u<<endl;
//	if(!u) return;
//	debug(tree[u].lc);
//	cout<<u<<" "<<tree[u].lc<<" "<<tree[u].rc<<" "<<tree[u].val<<endl;
//	debug(tree[u].rc);
	cout<<"rt:"<<rt<<endl;
	for(int u=1;u<=tot;u++) cout<<u<<" "<<tree[u].lc<<" "<<tree[u].rc<<" "<<tree[u].val<<endl;
}
int main(){
	scanf("%d",&n);
	for(int i=1,op,x;i<=n;i++){
		scanf("%d%d",&op,&x);
		if(op==1) insert(rt,x);
		if(op==2) remove(rt,x);
		if(op==3) printf("%d\n",rnk(rt,x)+1);
		if(op==4) printf("%d\n",kth(rt,x));
		if(op==5) printf("%d\n",pre(rt,x));
		if(op==6) printf("%d\n",nxt(rt,x));
//		cout<<rt<<endl;
//		puts("dfs"),debug(rt),puts("end");
	}
	return 0;
}
2024/1/3 13:56
加载中...