0分求助
查看原帖
0分求助
356925
快斗游鹿楼主2022/7/16 14:57

RT,样例过了,但依旧爆零。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000005;
const ll INF=2147483647;
struct Node{
	ll l,r,size,cnt,val;
}t[N];
ll q,countt;
void add(ll u,ll p){//插入
	t[u].size++;
	if(t[u].val==p){
		t[u].cnt++;
		return;
	}
	if(t[u].val>p){
		if(t[u].l!=0){
			add(t[u].l,p);
		}
		else{
			countt++;
			t[countt].val=p;
			t[countt].cnt=t[countt].size=1;
			t[u].l=countt;
		}
	}
	else{
		if(t[u].r!=0){
			add(t[u].r,p);
		}
		else{
			countt++;
			t[countt].val=p;
			t[countt].cnt=t[countt].size=1;
			t[u].r=countt;
		}
	}
}
ll qq (ll x,ll val,ll ans){//找前驱
	if(t[x].val>=val){
		if(t[x].l)qq(t[x].l,val,ans);
		else return ans;
	}
	else{
		if(t[x].r==0)return (t[x].val<val)?t[x].val:ans;
		if(t[x].cnt!=0)qq(t[x].r,val,t[x].val);
		else qq(t[x].r,val,ans);
	}
}
ll hj (ll x,ll val,ll ans){//找后继
	if(t[x].val<=val){
		if(t[x].r)hj(t[x].r,val,ans);
		else return ans;
	}
	else{
		if(t[x].l==0)return (t[x].val>val)?t[x].val:ans;
		if(t[x].cnt!=0)hj(t[x].l,val,t[x].val);
		else hj(t[x].l,val,ans);
	}
}
ll ask(ll p,ll x){//按照值找排名
	if(p==0)return 0;
	if(t[p].val==x)return t[t[p].l].size;
	if(t[p].val>x)return ask(t[p].l,x);
	return ask(t[p].r,x)+t[t[p].l].size+t[p].cnt;
}
ll ksa(ll p,ll x){//按照排名找值
	if(p==0)return INF;
	if(t[t[p].l].size>x){
		return ksa(t[p].l,x);
	}
	if(t[t[p].l].size+t[p].cnt>=x){
		return t[p].val;
	}
	return ksa(t[p].r,x-t[t[p].l].size-t[p].cnt);
} 
int main(){
	scanf("%lld",&q);
	for(int i=1;i<=q;i++){
		ll b,x;scanf("%lld%lld",&b,&x);
		if(b==1){
			printf("%lld\n",ask(1,x)+1);
		}
		else if(b==2){
			printf("%lld\n",ksa(1,x));
		}
		else if(b==3){
			printf("%lld\n",qq(1,x,-INF));
		}
		else if(b==4){
			printf("%lld\n",hj(1,x,INF));
		}
		else{
			if(countt==0){
				countt++;
				t[countt].size=t[countt].cnt=1;
				t[countt].val=x;
			}
			else add(1,x);
		}
	}
	return 0;
}

2022/7/16 14:57
加载中...