求助
  • 板块学术版
  • 楼主X_Chao_Bai
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/7/30 20:24
  • 上次更新2023/11/4 12:37:58
查看原帖
求助
241776
X_Chao_Bai楼主2021/7/30 20:24

为毛会MLE

#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
void file(){
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const double aph=0.75;
int cnt,root;
struct node{
	int l,r,val;
	int size,fact;
	bool exist;
}tzy[maxn];
void add(int &now,int val){
	now=++cnt;
	tzy[now].val=val;
	tzy[now].size=tzy[now].fact=1;
	tzy[now].exist=true;
}
bool imbalence(int now){
	int x=max(tzy[tzy[now].l].size,tzy[tzy[now].r].size);
	if(x>tzy[now].size*aph||tzy[now].size-tzy[now].fact>tzy[now].size*0.3)
		return true;
	else return false;
}
vector<int> a;
void medium(int now){
	medium(tzy[now].l);
	if(tzy[now].exist)
		a.push_back(now);
	medium(tzy[now].r);
}
void lift(int l,int r,int &now){
	int mid=(l+r)>>1;
	if(l==r){
		now=a[l];
		tzy[now].l=tzy[now].r=0;
		tzy[now].size=1;
		return ;
	}
	while(mid&&tzy[a[mid]].val==tzy[a[mid-1]].val) mid--;
	now=a[mid];
	if(l<mid)
		lift(l,mid-1,tzy[now].l);
	else tzy[now].l=0;
	lift(mid+1,r,tzy[now].r);
	tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
	tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1;
}
void rebuild(int &now){
	a.clear();
	medium(now);
	if(a.empty()){now=0;return ;}
	lift(0,a.size()-1,now);
}
void update(int now,int end){
	if(!now) return ;
	if(tzy[end].val<tzy[now].val)
		update(tzy[now].l,end);
	else update(tzy[now].r,end);
	tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
}
void check(int &now,int end){
	if(now==end) return ;
	if(imbalence(now)){
		rebuild(now);
		update(root,now);
		return;
	}
	if(tzy[end].val<tzy[now].val)
		check(tzy[now].l,end);
	else check(tzy[now].r,end);
}
void insert(int &now,int val){
	if(!now){
		add(now,val);
		check(root,now);
		return ;
	}
	tzy[now].size++,tzy[now].fact++;
	if(val<tzy[now].val)
		insert(tzy[now].l,val);
	else insert(tzy[now].r,val);
}
void del(int now,int val){
	if(tzy[now].exist&&tzy[now].val==val){
		tzy[now].exist=false;
		tzy[now].fact--;
		check(root,now);
		return ;
	}
	tzy[now].fact--;
	if(val<tzy[now].val)
		del(tzy[now].l,val);
	else del(tzy[now].r,val);
}
int getrank(int val){
	int now=root,rnk=1;
	while(now){
		if(val<=tzy[now].val)
			now=tzy[now].l;
		else{
			rnk+=tzy[now].exist+tzy[tzy[now].l].fact;
			now=tzy[now].r;
		}
	}
	return rnk;
}
int getval(int rnk){
	int now=root;
	while(now){
		if(tzy[now].exist&&tzy[tzy[now].l].fact+1==rnk)
			break;
		else if(tzy[tzy[now].l].fact>=rnk)
			now=tzy[now].l;
		else{
			rnk-=tzy[tzy[now].l].fact+tzy[now].exist;
			now=tzy[now].r;
		}
	}
	return tzy[now].val;
}
int n;
int main(){
	n=read();
	int opt,x;
	while(n--){
		opt=read(),x=read();
		switch(opt){
			case 1:insert(root,x);break;
			case 2:del(root,x);break;
			case 3:printf("%d\n",getrank(x));break;
			case 4:printf("%d\n",getval(x));break;
			case 5:printf("%d\n",getval(getrank(x)-1));break;
			case 6:printf("%d\n",getval(getrank(x+1)));break;
		}
	}
	return 0;
}


2021/7/30 20:24
加载中...