过了样例和 Subtask #1,但是
开了O2 全TLE
评测记录
不开O2 全MLE
评测记录
有没有好心人帮忙 解释产生这种情况的原因 或者 提点优化建议,谢谢QWQ
代码见下
#include<iostream>
using namespace std;
const int Maxn=10005;
const int inf=0x7fffffff;
struct node{
bool emp=true;//是否为空
int l=0,r=0;
int sum,siz=0;
}t[Maxn];
int len=0;
#define Emp t[k].emp
#define L t[k].l
#define R t[k].r
#define S t[k].sum
#define Si t[k].siz
void print(void){
for(int k=1;k<=len;k++)
cout<<S<<" "<<L<<" "<<R<<" "<<Si<<endl;
return;
}
void New(int k,int v){
Emp=false;
S=v;
Si=1;
return;
}
//插入
void insert(int v,int k=1){
if(Emp)//如果此位置为空
return New(++len,v);
Si++;
if(v>S){//去右子树
if(t[R].emp)
R=len+1;
return insert(v,R);
}
//去左子树
if(t[L].emp)
L=len+1;
return insert(v,L);
}
//找排名
int ask_rank(int v,int k=1,int sum=0){
if(Emp)
return sum+1;
if(v>S)
return ask_rank(v,R,sum+Si-t[R].siz);
else if(v<S)
return ask_rank(v,L,sum);
return sum+Si-t[R].siz;
}
//找对应值
int ask_value(int r,int k=1,int sum=0){
if(r==sum+Si-t[R].siz)
return S;
else if(r>sum+Si-t[R].siz)
return ask_value(r,R,Si-t[R].siz);
return ask_value(r,L);
}
//找前驱
int ask_per(int v,int k=1,int ans=-inf){
if(Emp)
return ans;
if(v<=S)
return ask_per(v,L,ans);
return ask_per(v,R,max(ans,S));
}
//找后继
int ask_back(int v,int k=1,int ans=inf){
if(Emp)
return ans;
if(v>=S)
return ask_back(v,R,ans);
return ask_back(v,L,min(ans,S));
}
#undef Emp
#undef L
#undef R
#undef S
#undef Si
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int q;
cin>>q;
while(q--){
int x,opt;
cin>>opt>>x;
switch(opt){
case 1:
cout<<ask_rank(x)<<'\n';
break;
case 2:
cout<<ask_value(x)<<'\n';
break;
case 3:
cout<<ask_per(x)<<'\n';
break;
case 4:
cout<<ask_back(x)<<'\n';
break;
case 5:
insert(x);
break;
}
}
return 0;
}
请回复之后@我