#2をSticey_training [HARD]

それは(1/9)が追加されました

A

B

C

D

E

F

G

2100 H

問題の意味

3つの操作は、番号が追加されます バツ バツ 、番号を削除します バツ バツ 、会うのどのように多くの数を尋ねました バツ から X \ oplus Y \当量Z
それは、与えられました から Y、Z

問題の解決策

それは不等号があるので、まず、ない排他的か、通常の操作を行うことができます。
まず、最初の二つのアクションが暗示します T R E トライ ツリー、それがどのような具体的なアクションですか?
ビット単位の裁判官、例えば、 から から K K ビットは 0 0 、この時点での問い合わせの時間、それがダウンしています 0 0 、ダウンし、この時点でいくつかのまたは多くの現在の数を決定していません。
しかし、それがある場合 1 1 、現在がある場合 1 1 、そして確かに 1 1 散歩がある場合 0 0 確保するため、 0 0 小さなまでとなります から から 、直接統計。
直接チェーン上の加算演算は、それほど問題がないので、ポイントを指すように、最初のノードを除いて、各エッジ対応するすべての時間を取り除きます。
その解決策。

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define sf(x) scanf("%d",&x)
using namespace std;

typedef long long ll;
const int maxn = 100000*30+500;
const ll mod = 1e9+7;

int val[maxn];
int ch[maxn][2];

struct Trie{
    int sz;
    void init(){
        sz=1;
        memset(ch,0,sizeof(ch));
        memset(val,0,sizeof(val));
    }
    void insert(int x){
        int u=0;
        for(int i=30;i>=0;i--){
            int  c=(x>>i)&1;
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
            val[u]++;
        }
    }
    void del(int x){
        int u=0;
        for(int i=30;i>=0;i--){
            int c=(x>>i)&1;
            if(!ch[u][c])return ;
            u=ch[u][c];
            --val[u];
        }
    }
    int query(int x,int y){
        int u=0,ret=0;
        for(int i=30;i>=0;i--){
            int c=(x>>i)&1,now=(y>>i)&1;
            if(now==0){
                if(ch[u][c])u=ch[u][c];
                else return ret;
            }
            else{
                if(ch[u][c])ret+=val[ch[u][c]];
                if(ch[u][c^1])u=ch[u][c^1];
                else return ret;
            }
        }
        return ret;
    }
}trie;

int main(){
    trie.init();
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int op,p,l;sf(op);
        if(op==1){
            sf(p);
            trie.insert(p);
        }
        else if(op==2){
            sf(p);
            trie.del(p);
        }
        else{
            sf(p);sf(l);
            int ans=trie.query(p,l);
            printf("%d\n",ans);
        }
    }
}

公開された170元の記事 ウォン称賛14 ビュー10000 +

おすすめ

転載: blog.csdn.net/mxYlulu/article/details/104077407