救救我的01trie
查看原帖
救救我的01trie
700717
why081023楼主2023/8/14 20:09
#include <bits/stdc++.h>
using namespace std;
int tot;
int a[2600005][2];
int s = 1e7;
int siz[2600005];

inline void insert(int val) {
    int now = 0;
    for (int i = 24; i >= 0; i--) {
        bool t = (1 << i)&val;
        if (!a[now][t])
            a[now][t] = ++tot;
        now = a[now][t];
        siz[now]++;
    }
}

inline void remove(int val) {
    int now = 0;
    for (int i = 24; i >= 0; i--) {
        bool t = (1 << i)&val;
        now = a[now][t];
        siz[now]--;
    }
}

inline int get_val(int rank) {
    int now = 0, ans = 0;
    for (int i = 24; i >= 0; i--) {
        bool t = siz[a[now][0]] < rank;
        if (t)
            rank -= siz[a[now][0]];
        ans += (1 << i) * t;
        now = a[now][t];
    }
    return ans;
}

inline int get_rank(int val) {
    int now = 0, ans = 0;
    for (int i = 24; i >= 0; i--) {
        bool t = (1 << i)&val;
        if (t)
            ans += siz[a[now][0]];
        if (!a[now][t])
            return ans + 1;
        now = a[now][t];
    }
    return ans + 1;
}
int n;

int main() {
    int now = 1;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int opt, x;
        scanf("%d%d", &opt, &x);
        if (opt == 1)
            insert(x + s);
        else if (opt == 2)
            remove(x + s);
        else if (opt == 3)
            cout << get_rank(x + s) << endl;
        else if (opt == 4)
            cout << get_val(x) - s << endl;
        else if (opt == 5) {
            int hh = get_rank(x + s);
            cout << get_val(hh - 1) - s << endl;
        } else {
            int hh = get_rank(x + s);
            int hhh = get_val(hh) - s;
            //cout << hhh << endl;
            if (hhh > x)
                cout << hhh << endl;
            else
                cout << get_val(hh + 1) - s << endl;
        }
    }
}
2023/8/14 20:09
加载中...