RT
这个帖子说深基的程序有误但可以 AC 本题,但是到底是数据按照深基配的还是数据弱了却不得而知
所以这题的数据到底有没有问题,如果没有,求给这份代码一个 Hack,谢谢!
#include <bits/stdc++.h>
using namespace std;
struct node{
int l,r,num,size,val;//left->small,right->big or ==
} a[10010];
int q;
int tot=1;
int rak(int x,int root){
if(root==0){
return 0;
}
if(x==0){
return 1;
}
if(a[root].val==x){
return a[a[root].l].size+1;
}
if(a[root].val<x){
return 1+a[a[root].l].size+rak(x,a[root].r);
}
if(a[root].val>x){
return rak(x,a[root].l);
}
}
int answer(int rk,int root){
if(a[a[root].l].size+1==rk){
return a[root].val;
}
if(a[a[root].l].size+1<rk){
return answer(rk-(a[a[root].l].size+1),a[root].r);
}
if(a[a[root].l].size+1>rk){
return answer(rk,a[root].l);
}
}
int lastone(int x,int root){
int ans=-2147483647;
if(x==0){
return -2147483647;
}
if(a[root].val<x&&a[root].r!=0){
ans=max(a[root].val,lastone(x,a[root].r));
return ans;
}
else if(a[root].l!=0){
ans=max(ans,lastone(x,a[root].l));
return ans;
}
else{
if(a[root].val<x){
ans=max(ans,a[root].val);
}
return ans;
}
}
int nextone(int x,int root){
int ans=2147483647;
if(x==0){
return 2147483647;
}
if(a[root].val>x&&a[root].l!=0){
ans=min(a[root].val,nextone(x,a[root].l));
return ans;
}
else if(a[root].r!=0){
ans=min(ans,nextone(x,a[root].r));
return ans;
}
else{
if(a[root].val>x){
ans=min(ans,a[root].val);
}
return ans;
}
}
void inser(int x,int root){
a[root].size++;
if(x>=a[root].val){
if(a[root].r==0){
a[root].r=tot;
a[a[root].r]={0,0,tot,1,x};
return;
}
inser(x,a[root].r);
return;
}
else{
if(a[root].l==0){
a[root].l=tot;
a[a[root].l]={0,0,tot,1,x};
return;
}
inser(x,a[root].l);
return;
}
}
int main(){
cin>>q;
while(q--){
int opt,x;
cin>>opt>>x;
if(opt==1){
cout<<rak(x,1)<<endl;
}
if(opt==5){
if(tot==1){
a[tot]={0,0,1,1,x};
tot++;
}
else{
inser(x,1);
tot++;
}
}
if(opt==2){
cout<<answer(x,1)<<endl;
}
if(opt==3){
cout<<lastone(x,1)<<endl;
}
if(opt==4){
cout<<nextone(x,1)<<endl;
}
}
return 0;
}