这个程序无法通过样例但能AC
#include <iostream>
using namespace std;
const int N =1e4+7,INF=0x7fffffff;
struct BST{
int ls,rs;
int val;
int sz,cnt;
}a[N];
int btot,broot;
int New(int val){
a[++btot].val = val;
a[btot].cnt = a[btot].sz = 1;
return btot;
}
void bupdate(int p){
a[p].sz = a[a[p].ls].sz + a[a[p].rs].sz + a[p].cnt;
}
void build(){
New(-INF),New(INF);
a[1].rs = 2; broot=1;
a[1].cnt = a[1].sz = a[2].cnt = a[2].sz =0;
bupdate(broot);
}
int GetRankByVal(int p,int val){
if(!p) return 0;
if(a[p].val == val) return a[a[p].ls].sz + 1;
if(a[p].val > val){
//if(!a[p].ls) return 1;
return GetRankByVal(a[p].ls,val);
}
return GetRankByVal(a[p].rs,val) + a[a[p].ls].sz + a[p].cnt;
}
int GetValByRank(int p,int rnk){
if(!p) return INF;
if(rnk <= a[a[p].ls].sz) return GetValByRank(a[p].ls,rnk);
if(rnk <= a[a[p].ls].sz + a[p].cnt) return a[p].val;
return GetValByRank(a[p].rs,rnk - a[a[p].ls].sz - a[p].cnt);
}
int GetPre(int val){
int ans=1;//a[1].val = -INF
int p = broot;
while(p){
if(a[p].val == val){
if(a[p].ls > 0){
p = a[p].ls;
while(a[p].rs > 0) p = a[p].rs;
ans = p;
}
break;
}
if(a[p].val < val && a[p].val > a[ans].val) ans=p;
p = a[p].val < val ? a[p].rs : a[p].ls;
}
return a[ans].val;
}
int GetNext(int val){
int ans=2;
int p=broot;
while(p){
if(a[p].val == val){
if(a[p].rs > 0){
p = a[p].rs;
while(a[p].ls > 0) p=a[p].ls;
ans = p;
}
break;
}
if(a[p].val > val && a[p].val < a[ans].val ) ans=p;
p = a[p].val < val ? a[p].rs : a[p].ls;
}
return a[ans].val;
}
void Insert(int &p,int val){
if(!p){
p=New(val);
return;
}
if(a[p].val == val){
a[p].cnt++,bupdate(p);
return;
}
if(a[p].val < val){
Insert(a[p].rs,val);
}
if(a[p].val > val){
Insert(a[p].ls,val);
}
bupdate(p);
}
int main() {
ios::sync_with_stdio(0);cin.tie(0);
build();
int q;cin>>q;
while(q--){
int op,x;cin>>op>>x;
if(op==1){
cout<<GetRankByVal(broot,x)+1<<'\n';
}
else if(op==2) cout<<GetValByRank(broot,x)<<'\n';
else if(op==3) cout<<GetPre(x)<<'\n';
else if(op==4) cout<<GetNext(x)<<'\n';
else Insert(broot,x);
}
return 0;
}
而将其中的
int GetRankByVal(int p,int val){
if(!p) return 0;
if(a[p].val == val) return a[a[p].ls].sz + 1;
if(a[p].val > val){
//if(!a[p].ls) return 1;
return GetRankByVal(a[p].ls,val);
}
return GetRankByVal(a[p].rs,val) + a[a[p].ls].sz + a[p].cnt;
}
修改为正确的
int GetRankByVal(int p,int val){
if(!p) return 0;
if(a[p].val == val) return a[a[p].ls].sz ;//这里没有了 +1
if(a[p].val > val){
//if(!a[p].ls) return 1;
return GetRankByVal(a[p].ls,val);
}
return GetRankByVal(a[p].rs,val) + a[a[p].ls].sz + a[p].cnt;
}
完整的差了一个“+1”,但两个程序都能通过。我只能理解为数据中的查询操作全部都是集合中没有的元素