萌新才学替罪羊树,求dalao帮忙查错
查看原帖
萌新才学替罪羊树,求dalao帮忙查错
117662
那一条变阻器楼主2020/6/13 11:38

样例都没过啊!!!

#include <bits/stdc++.h>
using namespace std;
struct node{
	int ls , rs , tsize , fsize , f , date;
};
int T;
int root , pool , poi , cnt , to_rebuild;
double alpha = 0.75;
int memo[400040] , c[400040];
node a[400040];
bool cheak(int now){	//判断是否重构 
	if((double)a[now].fsize * alpha <= (double)max(a[a[now].ls].fsize , a[a[now].rs].fsize)) return true;
	return false;
}
void dfs(int now){	//中序遍历 
	if(!now) return;
	dfs(a[now].ls);
	if(a[now].f) c[++poi] = now;
	else memo[++pool] = now;
	dfs(a[now].rs);
}
void build(int l , int r , int &now){	//建树 
	int mid = (l + r) / 2;
	now = c[mid];
	if(l == r){
		a[now].ls = a[now].rs = 0;
		a[now].fsize = a[now].tsize = 1;
		return;
	}
	if(l < mid) build(l , mid - 1 , a[now].ls);
	else a[now].ls = 0;
	build(mid + 1 , r , a[now].rs);
	a[now].tsize = a[a[now].ls].tsize + a[a[now].rs].tsize + 1;
	a[now].fsize = a[a[now].ls].fsize + a[a[now].rs].fsize + 1;
}
void rebuild(int &now){	//重建 
	poi = 0;
	dfs(now);
	if(poi) build(1 , poi , now);
	else now = 0;
}
void insert(int &now , int t){	//插入 
	if(!now){
		now = memo[pool--] , a[now].date = t;
		a[now].f = a[now].tsize = a[now].fsize = 1;
		a[now].ls = a[now].rs = 0;
		return;
	}
	a[now].tsize++ , a[now].fsize++;
	if(a[now].date >= t) insert(a[now].ls , t);
	else insert(a[now].rs , t);
	if(!cheak(now)){
		if(to_rebuild){
			if(a[now].ls == to_rebuild) rebuild(a[now].ls);
			else rebuild(a[now].rs);
			to_rebuild = 0;
		}
	}else to_rebuild = now;
}
void delet(int &now , int rk){	//删除排名为rk的数 
	if(a[now].f && a[a[now].ls].fsize + 1 == rk){
		a[now].f = 0;
		a[now].fsize--;
		return;
	}
	a[now].fsize--;
	if(a[a[now].ls].fsize + a[now].f >= rk) delet(a[now].ls , rk);
	else delet(a[now].rs , rk - a[a[now].ls].fsize - a[now].f);
}
int ft(int rk){	//超找排名为rk的数值为多少 
	int now = root;
	while(now){
		if(a[now].f && a[a[now].ls].fsize + 1 == rk) return a[now].date;
		else if(a[a[now].ls].fsize >= rk) now = a[now].ls;
		else{
			rk -= a[a[now].ls].fsize + a[now].f;
			now = a[now].rs;
		}
	}
}
int frk(int t){	//查找t的排位 
	int now = root , ans = 1;
	while(now){
		if(a[now].date >= t) now = a[now].ls;
		else{
			ans += a[a[now].ls].fsize + a[now].f;
			now = a[now].rs;
		}
	}
	return ans;
}
void rdelet(int t){	//删除值为t的数 
	delet(root , frk(t));
	if((double)a[root].tsize * alpha > a[root].fsize) rebuild(root);
}
int main(){
	cin >> T;
	for(int i = 2000000; i >= 1; i--) memo[++pool] = i;
	while(T--){
		int opt , x;
		cin >> opt >> x;
		if(opt == 1) insert(root , x);
		if(opt == 2) rdelet(x);
		if(opt == 3) cout << frk(x) << endl;
		if(opt == 4) cout << ft(x) << endl;
		if(opt == 5) cout << ft(frk(x) - 1) << endl;
		if(opt == 6) cout << ft(frk(x) + 1) << endl;
	}
	return 0;
}

2020/6/13 11:38
加载中...