编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#46406 #1001. A. 神秘谜题 Time Limit Exceeded 0 2026 ms 1304 K C++ 17 / 3.8 K 自动化钱001-徐启航 2020-09-20 21:24:44
显示原始代码
#include <iostream>

using namespace std;

struct Node {
    union {
        Node *s[2];
        struct {
            Node *l, *r;
        };
    };
    uint64_t v, len, n;
} * ROOT;

inline uint64_t get_len(uint64_t x) {
    uint64_t ret;
    asm("bsr %0, %1" : "=r"(ret) : "r"(x));
    return ret + 1;
}

inline uint64_t bsf(uint64_t x) {
    uint64_t ret;
    asm("bsf %0, %1" : "=r"(ret) : "r"(x));
    return ret;
}

void inc(Node *n) {
    uint64_t len = get_len(++n->v);
    if (len > n->len) {
        if (n->l || n->r)
            n->v = 0;
        if (n->l && n->r) {
            inc(n->l), inc(n->r);
        } else if (n->l) {
            inc(n->l);
            n->r = new Node;
            n->r->l = n->r->r = nullptr;
            n->r->v = n->r->len = 1;
            n->r->n = 1;
        } else if (n->r) {
            inc(n->r);
            n->l = new Node;
            n->l->l = n->l->r = nullptr;
            n->l->v = n->l->len = 1;
            n->l->n = 1;
        }
    }
}

uint64_t get_v(Node *n) {
    uint64_t vl = n->l ? get_v(n->l) : 0;
    uint64_t vr = n->r ? get_v(n->r) : 0;
    return ((vl ^ vr) << n->len) | ((n->n & 1) ? n->v : 0);
}

void insert_node(Node *n, uint64_t x) {
    if (n->v == x) {
        n->n++;
    } else {
        auto mlen = min(bsf(x ^ n->v), n->len);
        auto mix = n->v & ((1 << mlen) - 1);
        auto x2 = x >> mlen, v2 = n->v >> mlen;

        if (v2) {
            Node *n2 = new Node;
            n2->l = n->l, n2->r = n->r;
            n2->v = v2, n2->len = get_len(v2);
            n2->n = n->n;

            n->v = mix, n->len = mlen;
            n->s[v2 & 1] = n2, n->s[!(v2 & 1)] = nullptr;
            n->n++;

            if (x2) {
                Node *nx = new Node;
                nx->l = nx->r = nullptr;
                nx->v = x2, nx->len = get_len(x2);
                nx->n = 1;
                n->s[x2 & 1] = nx;
            }
        } else if (n->s[x2 & 1]) {
            insert_node(n->s[x2 & 1], x2);
        } else {
            Node *nx = new Node;
            nx->l = nx->r = nullptr;
            nx->v = x2, nx->len = get_len(x2);
            nx->n = 1;
            n->s[x2 & 1] = nx;
        }
    }
}

void insert(uint64_t x) {
    if (ROOT)
        insert_node(ROOT, x);
    else {
        ROOT = new Node;
        ROOT->l = ROOT->r = nullptr;
        ROOT->v = x, ROOT->len = get_len(x);
        ROOT->n = 1;
    }
}

void trav(Node *n) {
    cout << hex << n->v << dec << " (" << n->len << ", " << n->n << ") <" << endl;
    if (n->l)
        trav(n->l);
    if (n->r)
        trav(n->r);
    cout << ">\n";
}

int main() {
    int n;
    cin >> n;
    for (int _ = 0; _ < n; _++) {
        int op;
        uint64_t x;
        cin >> op;
        switch (op) {
            case 1:
                inc(ROOT);
                break;
            case 2:
                cin >> x;
                if (x != 0)
                    insert(x);
                break;
            default:
                break;
        }
        // trav(ROOT);
        cout << get_v(ROOT) << endl;
    }
}
子任务 #1
Time Limit Exceeded
得分:0
测试点 #1
Time Limit Exceeded
得分:0
用时:1023 ms
内存:1236 KiB

输入文件(1.in

200000
2 526767110
2 724642759
2 567837900
2 104106873
2 357915481
2 33997211
2 444788944
2 
<1586974 bytes omitted>

答案文件(1.ans

526767110
877985729
361528077
330887284
116239149
82537142
510237286
843295274
453728745
55
<2188330 bytes omitted>

用户输出

526767110
877985729
361528077
330887284
14229588
48226766
408752414
363832730
1021793882
112828498
529803750
529803542
706682614
<185301 bytes omitted>
测试点 #2
Time Limit Exceeded
得分:0
用时:1003 ms
内存:1304 KiB

输入文件(2.in

200000
2 515979308
2 512702340
2 684230440
2 488136957
2 598252313
2 283603971
2 349877373
2
<1586842 bytes omitted>

答案文件(2.ans

515979308
5115816
679905408
899606653
372667236
114362215
302756634
473674072
520218589
525
<2192841 bytes omitted>

用户输出

515979308
512702340
910667948
910667920
1897301666
1356361380
2037188188
2002584604
1898555668
1902376324
1038616912
1038616992

<177371 bytes omitted>