社区讨论

求助

P3369【模板】普通平衡树参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@m515uzcj
此快照首次捕获于
2024/12/23 22:57
去年
此快照最后确认于
2025/11/04 12:25
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
namespace trie{
    int b[5000000],t[5000000][2],tot=0;
    void insert(int x,int s){
        int p=0,c=pow(2,30);
        for(int i=30;i>=0;i--){
            int ch=(x/c)%2;
            if(!t[p][ch]) t[p][ch]=++tot,b[tot]=0,t[tot][0]=0,t[tot][1]=0;
            p=t[p][ch],b[p]+=s,c/=2;
        }
    }
    int find1(int x,int tt){
        int p=0,c=pow(2,30),ans=0;
        for(int i=30;i>=0;i--){
            int ch=(x/c)%2;
            if(ch==1) ans+=b[t[p][0]];
            p=t[p][ch],c/=2;
        }
        return tt?ans+1:ans+b[p];
    }
    int find2(int x){
        int p=0,ans=0;
        for(int i=30;i>=0;i--){
            if(b[t[p][0]]>=x) ans*=2,p=t[p][0];
            else ans=ans*2+1,x-=b[t[p][0]],p=t[p][1];
        }
        return ans;
    }
}
int num=1e7;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int op,x;
        cin>>op>>x;
        if(op==1) trie::insert(x+num,1);
        if(op==2) trie::insert(x+num,-1);
        if(op==3){
            trie::insert(x+num,1);
            cout<<trie::find1(x+num,1)<<endl;
            trie::insert(x+num,-1);
        }
        if(op==4) cout<<trie::find2(x)-num<<endl;
        if(op==5){
            trie::insert(x+num,1);
            cout<<trie::find2(trie::find1(x+num,1)-1)-num<<endl;
            trie::insert(x+num,-1);
        }
        if(op==6){
            trie::insert(x+num+1,1);
            int u=trie::find1(x+num+1,1);
            trie::insert(x+num+1,-1);
            cout<<trie::find2(u)-num<<endl;
        }
    }
}

CPP
#include<bits/stdc++.h>
using namespace std;
namespace trie{
    int b[5000000],t[5000000][2],tot=0;
    void insert(int x,int s){
        int p=0,c=pow(2,30);
        for(int i=30;i>=0;i--){
            int ch=(x/c)%2;
            if(!t[p][ch]) t[p][ch]=++tot,b[tot]=0,t[tot][0]=0,t[tot][1]=0;
            p=t[p][ch],b[p]+=s,c/=2;
        }
    }
    int find1(int x,int tt){
        int p=0,c=pow(2,30),ans=0;
        for(int i=30;i>=0;i--){
            int ch=(x/c)%2;
            if(ch==1) ans+=b[t[p][0]];
            p=t[p][ch],c/=2;
        }
        return tt?ans+1:ans+b[p];
    }
    int find2(int x){
        int p=0,ans=0;
        for(int i=30;i>=0;i--){
            if(b[t[p][0]]>=x) ans*=2,p=t[p][0];
            else ans=ans*2+1,x-=b[t[p][0]],p=t[p][1];
        }
        return ans;
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int op,x;
        cin>>op>>x;
        if(op==1) trie::insert(x,1);
        if(op==2) trie::insert(x,-1);
        if(op==3){
            trie::insert(x,1);
            cout<<trie::find1(x,1)<<endl;
            trie::insert(x,-1);
        }
        if(op==4) cout<<trie::find2(x)<<endl;
        if(op==5){
            trie::insert(x,1);
            cout<<trie::find2(trie::find1(x,1)-1)<<endl;
            trie::insert(x,-1);
        }
        if(op==6){
            trie::insert(x+1,1);
            int u=trie::find1(x+1,1);
            trie::insert(x+1,-1);
            cout<<trie::find2(u)<<endl;
        }
    }
}
为啥操作时(下面代码)不加上常数时WA了一个点,加上后(上面代码)AC了。

回复

5 条回复,欢迎继续交流。

正在加载回复...