CE求条
  • 板块学术版
  • 楼主xu222ux
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/5 13:03
  • 上次更新2023/11/5 15:18:38
查看原帖
CE求条
563663
xu222ux楼主2023/11/5 13:03

洛谷过不了编译,自己可以

#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
struct tree{
	int l=-1,r=-1,w=-1;
	int g=0,zg=0;
}a[1000005];
int cnt=2;
void it(){a[1].r=2,a[1].w=-inf,a[1].g=1,a[1].zg=2,a[2].zg=1,a[2].g=1,a[2].w=inf;}
int hj,qq,pa;
int see,ans_h;
int check_pos(int d,int x){
	if(a[d].w<x){
		if(see==1)a[d].zg-=ans_h;
		else if(see==2)a[d].zg+=ans_h;
		qq=max(qq,a[d].w),pa=d*10+1;
		if(a[d].r==-1)return -d;
		else return check_pos(a[d].r,x);
	}else if(a[d].w>x){
		if(see==1)a[d].zg-=ans_h;
		else if(see==2)a[d].zg+=ans_h;
		hj=min(hj,a[d].w),pa=d*10;
		if(a[d].l==-1)return -d;
		else return check_pos(a[d].l,x);
	}else return d;
}
void push_in(int x){
	cnt++,see=2,ans_h=1;
	int n=check_pos(1,x);
	if(n>0)a[n].g++,a[n].zg++;
	else{
		n=abs(n);
		if(x>a[n].w)a[n].r=cnt,a[cnt].w=x,a[cnt].g=1,a[cnt].zg=1;
		else a[n].l=cnt,a[cnt].w=x,a[cnt].g=1,a[cnt].zg=1;
	}
}
int check_s(int d,int x){//x small
	if(x>a[d].zg)return inf;
	if(x<=a[a[d].l].zg)return check_s(a[d].l,x);
	else if(x<=a[a[d].l].zg+a[d].g)return a[d].w;
	else return check_s(a[d].r,x-a[a[d].l].zg-a[d].g);
}
int check_z(int d,int x){//where is x
	if(d==-1)return 1;
	if(x==a[d].w)return a[a[d].l].zg+1;
	else if(x<a[d].w)return check_z(a[d].l,x);
	else return check_z(a[d].r,x)+a[a[d].l].zg+a[d].g;
}
void dfs_tree(int d){
	cout<<d<<' '<<a[d].w<<' '<<a[d].g<<' '<<a[d].zg<<' '<<a[a[d].l].w<<' '<<a[a[d].r].w<<"\n";
	if(a[d].l!=-1)dfs_tree(a[d].l);
	if(a[d].r!=-1)dfs_tree(a[d].r);
}
int check_h(int x){
	see=2,ans_h=1;
	int n=check_pos(1,x);
	if(n<0||a[n].r==-1){
		return hj;
	}else{
		n=a[n].r;
		while(a[n].l!=-1)n=a[n].l;
		ans_h=a[n].g;
		return a[n].w;
	}
}
int check_q(int x){
	see=0;
	int n=check_pos(1,x);
	if(n<0||a[n].l==-1){
		return qq;
	}else{
		n=a[n].l;
		while(a[n].r!=-1)n=a[n].r;
		return a[n].w;
	}
}
bool kkk;
void pop_out(int x,int hh){
	see=1,ans_h=hh;
	int n=check_pos(1,x);
	if(n<0){
		see=2;
		check_pos(1,x);
		return ;
	}else if(a[n].g==1||kkk){
		if(a[n].l!=-1&&a[n].r==-1){
			if(pa%10==1)a[pa/10].r=a[n].l;
			else a[pa/10].l=a[n].l;
		}else if(a[n].l==-1&&a[n].r==-1){
			if(pa%10==1)a[pa/10].r=-1;
			else a[pa/10].l=-1;
		}else if(a[n].l==-1&&a[n].r!=-1){
			if(pa%10==1)a[pa/10].r=a[n].r;
			else a[pa/10].l=a[n].r;
		}else{
			int nn=check_h(x);
			kkk=true;
			pop_out(nn,ans_h);
			kkk=false;
			see=2,ans_h--;
			check_pos(1,x);
			a[n].w=nn;
			a[n].g=ans_h+1;
			a[n].zg+=ans_h;
		}
	}else a[n].g--,a[n].zg--;
}
int main(){
	it();
	int q;cin>>q;
	while(q--){
		hj=inf,qq=-inf;
		int op,x;cin>>op>>x;
		if(op==0){//out put tree
			dfs_tree(1);
		}else if(op==5){//push
			push_in(x);
		}else if(op==1){//where is x
			int ans=check_z(1,x);
			cout<<ans-1<<endl;
		}else if(op==2){//x small
			int ans=check_s(1,x+1);
			if(ans==inf)cout<<"INF\n";
			else cout<<ans<<endl;
		}else if(op==4){//hj
			int ans=check_h(x);
			if(ans==inf)cout<<"2147483647\n";
			else cout<<ans<<endl;
		}else{//qq
			int ans=check_q(x);
			if(ans==-inf)cout<<"−2147483647\n";
			else cout<<ans<<endl;
		}
	}
	return 0;
}
2023/11/5 13:03
加载中...