这是我过不了样例的AC代码
#include<iostream>
#define INF 2147483647
using namespace std;
struct node{
int ls,rs,val;
int size,rank,cnt;
}tree[100000];
int siz=0;
void insert_a_node(int x,int v)
{
tree[x].size++;
//cout<<x<<' '<<v<<' '<<tree[x].val<<endl;
if(tree[x].val==v)
{
tree[x].cnt++;
return ;
}
else
if(tree[x].val>v)
if(tree[x].ls!=0)
insert_a_node(tree[x].ls,v);
else
siz++,tree[x].ls=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
else
if(tree[x].val<v)
if(tree[x].rs!=0)
insert_a_node(tree[x].rs,v);
else
siz++,tree[x].rs=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
}
int find_front_val(int x,int val,int ans)
{
if(tree[x].val>=val)
if(!tree[x].ls)
return ans;
else
find_front_val(tree[x].ls,val,ans);
else
if(!tree[x].rs)
return ((tree[x].val<val)?(tree[x].val):(ans));
else
if(tree[x].cnt!=0)
find_front_val(tree[x].rs,val,tree[x].val);
else
find_front_val(tree[x].rs,val,ans);
}
int find_back_val(int x,int val,int ans)
{
if(tree[x].val<=val)
if(!tree[x].rs)
return ans;
else
find_back_val(tree[x].rs,val,ans);
else
if(!tree[x].ls)
return ((tree[x].val>val)?(tree[x].val):(ans));
else
if(tree[x].cnt!=0)
find_back_val(tree[x].ls,val,tree[x].val);
else
find_back_val(tree[x].ls,val,ans);
}
int find_val_rank(int x,int val)
{
if(x==0)return 0;
else if(val==tree[x].val)return tree[tree[x].ls].size+1;
else if(val<tree[x].val)return find_val_rank(tree[x].ls,val);
return find_val_rank(tree[x].rs,val)+tree[tree[x].ls].size+tree[x].cnt;
}
int find_rank_val(int x,int rank)
{
if(x==0)return 0;
else if(tree[tree[x].ls].size>=rank)return find_rank_val(tree[x].ls,rank);
else if(tree[tree[x].ls].size+tree[x].cnt>=rank)return tree[x].val;
return find_rank_val(tree[x].rs,rank-tree[tree[x].ls].size-tree[x].cnt);
}
int main()
{
int n;
cin>>n;
for(int p=1,cao,x;p<=n;p++)
{
cin>>cao>>x;
if(cao==1)cout<<find_val_rank(1,x)+1<<endl;
else if(cao==2)cout<<find_rank_val(1,x)<<endl;
else if(cao==3)cout<<find_front_val(1,x,-INF)<<endl;
else if(cao==4)cout<<find_back_val(1,x,INF)<<endl;
else if(siz==0)tree[1].val=x,tree[1].size=tree[1].cnt=1,siz++;else insert_a_node(1,x);
}
}
这是我过了样例的保龄代码
#include<iostream>
#define INF 2147483647
using namespace std;
struct node{
int ls,rs,val;
int size,rank,cnt;
}tree[100000];
int siz=0;
void insert_a_node(int x,int v)
{
tree[x].size++;
//cout<<x<<' '<<v<<' '<<tree[x].val<<endl;
if(tree[x].val==v)
{
tree[x].cnt++;
return ;
}
else
if(tree[x].val>v)
if(tree[x].ls!=0)
insert_a_node(tree[x].ls,v);
else
siz++,tree[x].ls=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
else
if(tree[x].val<v)
if(tree[x].rs!=0)
insert_a_node(tree[x].rs,v);
else
siz++,tree[x].rs=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
}
int find_front_val(int x,int val,int ans)
{
if(tree[x].val>=val)
if(!tree[x].ls)
return ans;
else
find_front_val(tree[x].ls,val,ans);
else
if(!tree[x].rs)
return ((tree[x].val<val)?(tree[x].val):(ans));
else
if(tree[x].cnt!=0)
find_front_val(tree[x].rs,val,tree[x].val);
else
find_front_val(tree[x].rs,val,ans);
}
int find_back_val(int x,int val,int ans)
{
if(tree[x].val<=val)
if(!tree[x].rs)
return ans;
else
find_back_val(tree[x].rs,val,ans);
else
if(!tree[x].ls)
return ((tree[x].val>val)?(tree[x].val):(ans));
else
if(tree[x].cnt!=0)
find_back_val(tree[x].ls,val,tree[x].val);
else
find_back_val(tree[x].ls,val,ans);
}
int find_val_rank(int x,int val)
{
if(x==0)return 0;
else if(val==tree[x].val)return tree[tree[x].ls].size+1;
else if(val<tree[x].val)return find_val_rank(tree[x].ls,val);
return find_val_rank(tree[x].rs,val)+tree[tree[x].ls].size+tree[x].cnt;
}
int find_rank_val(int x,int rank)
{
if(x==0)return 0;
else if(tree[tree[x].ls].size>=rank)return find_rank_val(tree[x].ls,rank);
else if(tree[tree[x].ls].size+tree[x].cnt>=rank)return tree[x].val;
return find_rank_val(tree[x].rs,rank-tree[tree[x].ls].size-tree[x].cnt);
}
int main()
{
int n;
cin>>n;
for(int p=1,cao,x;p<=n;p++)
{
cin>>cao>>x;
if(cao==1)cout<<find_val_rank(1,x)<<endl;//没有+1
else if(cao==2)cout<<find_rank_val(1,x)<<endl;
else if(cao==3)cout<<find_front_val(1,x,-INF)<<endl;
else if(cao==4)cout<<find_back_val(1,x,INF)<<endl;
else if(siz==0)tree[1].val=x,tree[1].size=tree[1].cnt=1,siz++;else insert_a_node(1,x);
}
}
这里是查找排名时操作应该+1的,但是样例没有+1啊qwq
这是灵异事件吗?qwq