답안 #681533

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
681533 2023-01-13T09:24:12 Z nutella Collapse (JOI18_collapse) C++17
100 / 100
1073 ms 50136 KB
#include <bits/stdc++.h>
#include "collapse.h"

using namespace std;

constexpr int inf = 1e9 + 7;

struct DSU {
    vector<int> p, sz;

    DSU(int n) : p(n), sz(n, 1) {
        iota(p.begin(), p.end(), 0);
    }

    DSU() = default;

    int get(int x) {
        return p[x] == x ? x : p[x] = get(p[x]);
    }

    bool unite(int a, int b) {
        a = get(a), b = get(b);
        if (a == b) return false;
        if (sz[a] < sz[b]) swap(a, b);
        p[b] = a;
        sz[a] += sz[b];
        return true;
    }
};

struct Fenwick {
    vector<int> t;
    int n{};

    Fenwick() = default;

    Fenwick(int n) : n(n), t(n + 1) {}

    void modify(int i, int val) {
        for (int x = i + 1; x <= n; x += x & -x) {
            t[x] += val;
        }
    }

    int sum(int i) {
        int ans = 0;
        for (int x = i + 1; x > 0; x -= x & -x) {
            ans += t[x];
        }
        return ans;
    }
};

struct Edge {
    int l, r;
    int u, v;
    int w;
    int x, y;

    bool operator<(Edge b) const {
        return w < b.w;
    }
};

constexpr int N = 100001;

vector<array<int, 2>> queries[N];

int n, answer[N];

Fenwick fn;

void solve(int lx, int rx, vector<Edge> e, int sz) {
    e.erase(stable_partition(e.begin(), e.end(), [&](Edge ed) {
        return ed.l < rx && ed.r > lx;
    }), e.end());

    vector<int> alive(sz);
    for (auto &ed : e) {
        alive[ed.u] = alive[ed.v] = 1;
    }

    vector<int> id(sz);
    int last_id = 0;
    for (int i = 0; i < sz; ++i) {
        if (alive[i]) {
            id[i] = last_id++;
        }
    }

    sz = last_id;
    for (auto &ed : e) {
        ed.u = id[ed.u], ed.v = id[ed.v];
    }

    DSU d1(sz), d2(sz);
    for (auto [l, r, u, v, w, x, y]: e) {
        if (l > lx || r < rx) {
            d1.unite(u, v);
        }
    }

    vector<int> done;
    for (auto [l, r, u, v, w, x, y]: e) {
        if (l <= lx && rx <= r && d1.unite(u, v)) {
            done.push_back(y);

            d2.unite(u, v);

            fn.modify(y, 1);
        }
    }

    if (lx + 1 == rx) {
        for (auto [i, u]: queries[lx]) {
            answer[i] += fn.sum(u);
        }
    } else {
        int cnt = 0;
        for (int i = 0; i < sz; ++i) {
            if (d2.get(i) == i) {
                id[i] = cnt++;
            }
        }

        DSU d(cnt);
        for (auto &[l, r, u, v, w, x, y]: e) {
            u = id[d2.get(u)], v = id[d2.get(v)];
            if (l <= lx && rx <= r && !d.unite(u, v)) {
                l = inf, r = -inf;
            }
        }

        int mid = (lx + rx) / 2;
        solve(lx, mid, e, cnt), solve(mid, rx, e, cnt);
    }

    for (int r : done) {
        fn.modify(r, -1);
    }
}

std::vector<int> simulateCollapse(int N, std::vector<int> T, std::vector<int> X, std::vector<int> Y, std::vector<int> W,
                                  std::vector<int> P) {
    const int q = P.size(), c = T.size();
    ::n = N;


    map<pair<int, int>, int> last;

    vector<Edge> e;

    for (int i = 0; i < c; ++i) {
        if (X[i] > Y[i]) {
            swap(X[i], Y[i]);
        }
        if (T[i] == 0) {
            last[{X[i], Y[i]}] = i;
        } else {
            e.push_back({last[{X[i], Y[i]}], i, X[i], Y[i], 0, X[i], Y[i]});
            last.erase({X[i], Y[i]});
        }
    }

    for (auto [x, y]: last) {
        e.push_back({y, c, x.first, x.second, 0, x.first, x.second});
    }

    for (int _ = 0; _ < 2; ++_) {
        fn = Fenwick(n);

        for (auto &[s, t, a, b, w, x, y]: e) {
            w = y;
        }

        sort(e.begin(), e.end());

        for (int i = 0; i < c; ++i) {
            queries[i].clear();
        }

        for (int i = 0; i < q; ++i) {
            queries[W[i]].push_back({i, P[i]});
        }

        solve(0, c, e, n);

        for (auto &[s, t, a, b, w, x, y]: e) {
            x = n - x - 1, y = n - y - 1;
            swap(x, y);
            a = x, b = y;
            w = 0;
        }

        for (int i = 0; i < q; ++i) {
            P[i] = n - P[i] - 2;
        }
    }

    vector<int> ans(q);
    for (int i = 0; i < q; ++i) {
        ans[i] = n - answer[i];
    }

    return ans;
}

Compilation message

collapse.cpp: In constructor 'Fenwick::Fenwick(int)':
collapse.cpp:33:9: warning: 'Fenwick::n' will be initialized after [-Wreorder]
   33 |     int n{};
      |         ^
collapse.cpp:32:17: warning:   'std::vector<int> Fenwick::t' [-Wreorder]
   32 |     vector<int> t;
      |                 ^
collapse.cpp:37:5: warning:   when initialized here [-Wreorder]
   37 |     Fenwick(int n) : n(n), t(n + 1) {}
      |     ^~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 3412 KB Output is correct
2 Correct 4 ms 2772 KB Output is correct
3 Correct 4 ms 2772 KB Output is correct
4 Correct 3 ms 2772 KB Output is correct
5 Correct 21 ms 3412 KB Output is correct
6 Correct 37 ms 4492 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 5 ms 2900 KB Output is correct
9 Correct 21 ms 3856 KB Output is correct
10 Correct 29 ms 4068 KB Output is correct
11 Correct 36 ms 5064 KB Output is correct
12 Correct 34 ms 5036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 5704 KB Output is correct
2 Correct 26 ms 6228 KB Output is correct
3 Correct 449 ms 18388 KB Output is correct
4 Correct 27 ms 6256 KB Output is correct
5 Correct 599 ms 18472 KB Output is correct
6 Correct 63 ms 7716 KB Output is correct
7 Correct 911 ms 39092 KB Output is correct
8 Correct 562 ms 20088 KB Output is correct
9 Correct 29 ms 6472 KB Output is correct
10 Correct 29 ms 6752 KB Output is correct
11 Correct 40 ms 7688 KB Output is correct
12 Correct 531 ms 24444 KB Output is correct
13 Correct 795 ms 34868 KB Output is correct
14 Correct 864 ms 50136 KB Output is correct
15 Correct 829 ms 49072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 5736 KB Output is correct
2 Correct 26 ms 5876 KB Output is correct
3 Correct 26 ms 6228 KB Output is correct
4 Correct 35 ms 6256 KB Output is correct
5 Correct 36 ms 6252 KB Output is correct
6 Correct 60 ms 7552 KB Output is correct
7 Correct 658 ms 30296 KB Output is correct
8 Correct 1065 ms 41832 KB Output is correct
9 Correct 31 ms 6472 KB Output is correct
10 Correct 35 ms 7404 KB Output is correct
11 Correct 901 ms 47616 KB Output is correct
12 Correct 907 ms 48984 KB Output is correct
13 Correct 964 ms 47536 KB Output is correct
14 Correct 865 ms 48968 KB Output is correct
15 Correct 937 ms 47704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 3412 KB Output is correct
2 Correct 4 ms 2772 KB Output is correct
3 Correct 4 ms 2772 KB Output is correct
4 Correct 3 ms 2772 KB Output is correct
5 Correct 21 ms 3412 KB Output is correct
6 Correct 37 ms 4492 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 5 ms 2900 KB Output is correct
9 Correct 21 ms 3856 KB Output is correct
10 Correct 29 ms 4068 KB Output is correct
11 Correct 36 ms 5064 KB Output is correct
12 Correct 34 ms 5036 KB Output is correct
13 Correct 27 ms 5704 KB Output is correct
14 Correct 26 ms 6228 KB Output is correct
15 Correct 449 ms 18388 KB Output is correct
16 Correct 27 ms 6256 KB Output is correct
17 Correct 599 ms 18472 KB Output is correct
18 Correct 63 ms 7716 KB Output is correct
19 Correct 911 ms 39092 KB Output is correct
20 Correct 562 ms 20088 KB Output is correct
21 Correct 29 ms 6472 KB Output is correct
22 Correct 29 ms 6752 KB Output is correct
23 Correct 40 ms 7688 KB Output is correct
24 Correct 531 ms 24444 KB Output is correct
25 Correct 795 ms 34868 KB Output is correct
26 Correct 864 ms 50136 KB Output is correct
27 Correct 829 ms 49072 KB Output is correct
28 Correct 26 ms 5736 KB Output is correct
29 Correct 26 ms 5876 KB Output is correct
30 Correct 26 ms 6228 KB Output is correct
31 Correct 35 ms 6256 KB Output is correct
32 Correct 36 ms 6252 KB Output is correct
33 Correct 60 ms 7552 KB Output is correct
34 Correct 658 ms 30296 KB Output is correct
35 Correct 1065 ms 41832 KB Output is correct
36 Correct 31 ms 6472 KB Output is correct
37 Correct 35 ms 7404 KB Output is correct
38 Correct 901 ms 47616 KB Output is correct
39 Correct 907 ms 48984 KB Output is correct
40 Correct 964 ms 47536 KB Output is correct
41 Correct 865 ms 48968 KB Output is correct
42 Correct 937 ms 47704 KB Output is correct
43 Correct 455 ms 17764 KB Output is correct
44 Correct 898 ms 38080 KB Output is correct
45 Correct 494 ms 19152 KB Output is correct
46 Correct 1073 ms 41732 KB Output is correct
47 Correct 40 ms 6464 KB Output is correct
48 Correct 29 ms 6860 KB Output is correct
49 Correct 39 ms 7684 KB Output is correct
50 Correct 132 ms 11940 KB Output is correct
51 Correct 534 ms 21948 KB Output is correct
52 Correct 747 ms 30840 KB Output is correct
53 Correct 681 ms 29004 KB Output is correct
54 Correct 765 ms 35268 KB Output is correct
55 Correct 782 ms 33996 KB Output is correct
56 Correct 804 ms 38520 KB Output is correct
57 Correct 882 ms 43124 KB Output is correct
58 Correct 824 ms 43968 KB Output is correct
59 Correct 912 ms 47744 KB Output is correct
60 Correct 874 ms 48956 KB Output is correct