数据过水,样例没过的程序可以通过
查看原帖
数据过水,样例没过的程序可以通过
235658
llzzxx712楼主2022/12/25 11:47

这个程序无法通过样例但能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”,但两个程序都能通过。我只能理解为数据中的查询操作全部都是集合中没有的元素

2022/12/25 11:47
加载中...