QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#448647#8809. Telephone PlansQwerty12320 0ms3840kbC++235.6kb2024-06-19 20:34:182024-06-19 20:34:19

Judging History

你现在查看的是最新测评结果

  • [2024-06-19 20:34:19]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:3840kb
  • [2024-06-19 20:34:18]
  • 提交

answer

#include <bits/stdc++.h>

class ETT {
   private:
    using ind_t = int;
    struct Node {
        ind_t left, right, prev;
        uint32_t y;
        int sz;

        Node() : left(-1), right(-1), prev(-1), sz(1) {
            sizeof(Node);
            static std::mt19937 rnd;
            y = rnd();
        }
    };

    std::vector<Node> data;

    int get_sz(ind_t p) {
        return p != -1 ? data[p].sz : 0;
    }
    void upd_prv(ind_t p, ind_t prv) {
        if (p != -1) {
            data[p].prev = prv;
        }
    }
    void upd(ind_t p) {
        if (p != -1) {
            upd_prv(data[p].left, p);
            upd_prv(data[p].right, p);
            data[p].sz = 1 + get_sz(data[p].left) + get_sz(data[p].right);
        }
    }

    ind_t merge(ind_t a, ind_t b) {
        if (a == -1 || b == -1) {
            return a != -1 ? a : b;
        }
        if (data[a].y < data[b].y) {
            data[a].right = merge(data[a].right, b);
            return upd(a), a;
        } else {
            data[b].left = merge(a, data[b].left);
            return upd(b), b;
        }
    }

    ind_t merge(std::initializer_list<ind_t> list) {
        ind_t rt = -1;
        for (ind_t ptr : list) {
            rt = merge(rt, ptr);
        }
        return rt;
    }

    std::pair<ind_t, ind_t> split(ind_t p, int ind) {
        if (p == -1) {
            return {-1, -1};
        }
        if (get_sz(data[p].left) + 1 <= ind) {
            auto [a, b] = split(((data[p].right != -1 ? data[data[p].right].prev = -1 : 0), data[p].right), ind - (get_sz(data[p].left) + 1));
            data[p].right = a;
            upd(p);
            return {p, b};
        } else {
            auto [a, b] = split(((data[p].left != -1 ? data[data[p].left].prev = -1 : 0), data[p].left), ind);
            data[p].left = b;
            upd(p);
            return {a, p};
        }
    }

    template <int N>
    std::array<ind_t, N> split(ind_t p, std::array<int, N - 1> ar) {
        std::array<ind_t, N> res;
        for (int i = 0; i < N - 1; i++) {
            auto [a, b] = split(p, ar[i] - (i == 0 ? 0 : ar[i - 1]));
            res[i] = a;
            res[i + 1] = b;
            p = b;
        }
        return res;
    }

    std::pair<ind_t, int> ascend(ind_t p) {
        if (p == -1) {
            return {p, 0};
        }
        int ind = get_sz(data[p].left);
        while (data[p].prev != -1) {
            ind += (get_sz(data[data[p].prev].left) + 1) * (p == data[data[p].prev].right);
            p = data[p].prev;
        }
        return {p, ind};
    }

    std::vector<ind_t> vec;
    std::map<std::pair<int, int>, std::pair<ind_t, ind_t>> map;

   public:
    ETT() = default;
    ETT(int n) {
        data.assign(3 * n, Node());
        vec.resize(2 * n);
        for (int i = 0; i < 2 * n; i++) {
            vec[i] = n + i;
        }
    }

    std::pair<int, int> add_edge(int u, int v) {
        if (u > v) {
            std::swap(u, v);
        }
        ind_t rt1 = u, rt2 = v;
        ind_t uv = vec.rbegin()[0], vu = vec.rbegin()[1];
        vec.pop_back(), vec.pop_back();
        data[uv] = Node(), data[uv] = Node();
        map[{u, v}] = {uv, vu};

        auto [r1, ind1] = ascend(rt1);
        auto [r2, ind2] = ascend(rt2);

        int sz1 = get_sz(r1) / 3 + 1;
        int sz2 = get_sz(r2) / 3 + 1;

        auto [x1, y1] = split(r1, ind1);
        auto [x2, y2] = split(r2, ind2);

        auto rt = merge({x1, uv, y2, x2, vu, y1});
        return {sz1, sz2};
    }

    std::pair<int, int> cut_edge(int u, int v) {
        if (u > v) {
            std::swap(u, v);
        }
        auto [uv, vu] = map[{u, v}];
        map.erase({u, v});
        auto [rt, ind1] = ascend(uv);
        auto [__, ind2] = ascend(vu);

        if (ind1 > ind2) {
            std::swap(ind1, ind2);
        }
        auto [a, b, c, d, e] = split<5>(rt, {ind1, ind1 + 1, ind2, ind2 + 1});
        auto f = merge(a, e);
        vec.push_back(b);
        vec.push_back(d);

        int sz1 = get_sz(f) / 2 + 1;
        int sz2 = get_sz(c) / 2 + 1;
        return {sz1, sz2};
    }
};

int32_t main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int E;
    int n, q;
    std::cin >> E >> n >> q;

    int64_t all_dlt = 0, cur_sum = 0, last_ans = 0;
    std::vector<int64_t> ans = {0};
    ETT ett(n);

    for (int i = 0; i < q; i++) {
        int tp;
        std::cin >> tp;
        if (tp == 3) {
            int64_t t;
            std::cin >> t;
            if (E == 1) {
                t ^= last_ans;
            }

            ans.push_back(ans.back());
            last_ans = ans.rbegin()[t] + all_dlt;
            std::cout << ans.rbegin()[t] + all_dlt << "\n";
        } else {
            int64_t u, v;
            std::cin >> u >> v;
            if (E == 1) {
                u ^= last_ans;
                v ^= last_ans;
            }
            u--;
            v--;

            if (u > v) {
                std::swap(u, v);
            }

            if (tp == 1) {
                auto [sz1, sz2] = ett.add_edge(u, v);
                int64_t dlt = int64_t(sz1) * sz2;
                ans.push_back(ans.back());
                cur_sum += dlt;

                all_dlt += dlt;
            } else {
                auto [sz1, sz2] = ett.cut_edge(u, v);
                int64_t dlt = int64_t(sz1) * sz2;
                cur_sum -= dlt;
                ans.push_back({cur_sum - all_dlt});
            }
        }
    }

    return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 3
Accepted
time: 0ms
memory: 3840kb

input:

0
1 147
3 0
3 0
3 1
3 1
3 0
3 5
3 5
3 1
3 1
3 4
3 8
3 2
3 10
3 13
3 10
3 8
3 8
3 0
3 16
3 3
3 1
3 20
3 2
3 10
3 16
3 13
3 17
3 12
3 22
3 7
3 8
3 2
3 12
3 32
3 12
3 31
3 2
3 0
3 21
3 24
3 28
3 32
3 9
3 18
3 26
3 11
3 45
3 35
3 14
3 34
3 49
3 31
3 43
3 11
3 21
3 50
3 4
3 11
3 31
3 51
3 28
3 26
3 18
3 ...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 147 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3560kb

input:

0
2 10
1 1 2
3 1
3 1
3 2
3 3
3 3
3 3
2 1 2
3 2
3 3

output:

1
1
1
1
1
1
1
1

result:

ok 8 lines

Test #3:

score: -3
Wrong Answer
time: 0ms
memory: 3564kb

input:

0
30 150
1 14 10
3 1
1 14 6
1 3 6
3 4
3 4
1 2 3
3 0
3 5
1 2 9
1 11 9
3 8
1 19 11
3 6
1 8 19
3 14
3 10
1 27 8
3 15
1 27 28
1 28 20
3 0
3 3
1 20 7
1 7 23
3 13
3 5
1 24 23
3 0
3 28
1 24 13
3 5
3 32
3 1
3 13
1 30 13
3 25
1 30 16
1 15 16
3 22
1 29 15
3 13
1 29 25
1 25 1
1 1 18
3 17
3 8
3 10
1 26 18
3 46
...

output:

1
6
6
10
10
21
28
36
36
45
66
66
91
91
105
105
120
120
120
120
136
171
190
253
253
253
276
276
300
300
300
325
351
351
351
351
406
406
435
435
435
435
435
392
435
435
435
234
435
435
392
435
435
-10
435
70
435
435
435
-10
392
-56
-34
-10
-34
435
435
164
435
-114
435
435
435
-77
435
435
-170
435
-130...

result:

wrong answer 44th lines differ - expected: '406', found: '392'

Subtask #2:

score: 0
Runtime Error

Test #29:

score: 2
Accepted
time: 0ms
memory: 3628kb

input:

1
1 147
3 0
3 0
3 1
3 1
3 3
3 0
3 6
3 6
3 0
3 2
3 0
3 5
3 12
3 1
3 2
3 10
3 13
3 15
3 3
3 12
3 20
3 18
3 10
3 12
3 2
3 12
3 14
3 26
3 12
3 24
3 7
3 7
3 6
3 29
3 32
3 16
3 23
3 14
3 25
3 13
3 13
3 31
3 20
3 26
3 0
3 40
3 23
3 28
3 35
3 1
3 31
3 2
3 34
3 37
3 3
3 39
3 17
3 4
3 41
3 11
3 16
3 48
3 10
3...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 147 lines

Test #30:

score: 0
Accepted
time: 0ms
memory: 3560kb

input:

1
2 10
1 1 2
3 1
3 1
3 1
3 1
3 1
3 2
3 6
2 0 3
3 2

output:

1
1
1
1
1
1
1
1

result:

ok 8 lines

Test #31:

score: -2
Runtime Error

input:

1
30 150
1 21 13
3 1
1 9 20
3 2
3 2
1 18 11
1 18 0
3 6
3 9
3 8
1 12 9
3 8
3 7
1 10 9
3 5
3 24
3 26
3 28
1 6 16
3 6
3 14
1 15 23
3 21
3 48
1 60 47
3 53
3 37
1 35 53
3 56
1 57 59
1 59 37
3 63
3 95
3 94
1 92 79
3 65
1 90 81
1 95 81
3 75
3 111
3 118
3 100
1 124 98
1 101 98
3 121
3 132
3 137
3 153
1 141 ...

output:


result:


Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #2:

0%

Subtask #5:

score: 0
Skipped

Dependency #3:

0%

Subtask #6:

score: 0
Skipped

Dependency #4:

0%

Subtask #7:

score: 0
Skipped

Dependency #6:

0%