답안 #681535

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

using namespace std;

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> id(sz);
    for (auto &ed : e) {
        id[ed.u] = id[ed.v] = 1;
    }
    
    int last_id = 0;
    for (int i = 0; i < sz; ++i) {
        if (id[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 = rx + 228, r = lx - 228;
            }
        }

        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:31:9: warning: 'Fenwick::n' will be initialized after [-Wreorder]
   31 |     int n{};
      |         ^
collapse.cpp:30:17: warning:   'std::vector<int> Fenwick::t' [-Wreorder]
   30 |     vector<int> t;
      |                 ^
collapse.cpp:35:5: warning:   when initialized here [-Wreorder]
   35 |     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 3 ms 2772 KB Output is correct
4 Correct 3 ms 2772 KB Output is correct
5 Correct 20 ms 3412 KB Output is correct
6 Correct 33 ms 4484 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 3 ms 2772 KB Output is correct
9 Correct 20 ms 3796 KB Output is correct
10 Correct 27 ms 4052 KB Output is correct
11 Correct 34 ms 5092 KB Output is correct
12 Correct 34 ms 5004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 5704 KB Output is correct
2 Correct 28 ms 6260 KB Output is correct
3 Correct 468 ms 18364 KB Output is correct
4 Correct 25 ms 6396 KB Output is correct
5 Correct 567 ms 18464 KB Output is correct
6 Correct 60 ms 7704 KB Output is correct
7 Correct 875 ms 39276 KB Output is correct
8 Correct 494 ms 19920 KB Output is correct
9 Correct 36 ms 6080 KB Output is correct
10 Correct 28 ms 6356 KB Output is correct
11 Correct 43 ms 7340 KB Output is correct
12 Correct 513 ms 23412 KB Output is correct
13 Correct 832 ms 33872 KB Output is correct
14 Correct 896 ms 48960 KB Output is correct
15 Correct 778 ms 47992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 5704 KB Output is correct
2 Correct 29 ms 5868 KB Output is correct
3 Correct 26 ms 6136 KB Output is correct
4 Correct 26 ms 6260 KB Output is correct
5 Correct 41 ms 6312 KB Output is correct
6 Correct 62 ms 7660 KB Output is correct
7 Correct 636 ms 30304 KB Output is correct
8 Correct 986 ms 41520 KB Output is correct
9 Correct 30 ms 6124 KB Output is correct
10 Correct 34 ms 6912 KB Output is correct
11 Correct 857 ms 46552 KB Output is correct
12 Correct 828 ms 47800 KB Output is correct
13 Correct 884 ms 46468 KB Output is correct
14 Correct 832 ms 47736 KB Output is correct
15 Correct 853 ms 46676 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 3 ms 2772 KB Output is correct
4 Correct 3 ms 2772 KB Output is correct
5 Correct 20 ms 3412 KB Output is correct
6 Correct 33 ms 4484 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 3 ms 2772 KB Output is correct
9 Correct 20 ms 3796 KB Output is correct
10 Correct 27 ms 4052 KB Output is correct
11 Correct 34 ms 5092 KB Output is correct
12 Correct 34 ms 5004 KB Output is correct
13 Correct 26 ms 5704 KB Output is correct
14 Correct 28 ms 6260 KB Output is correct
15 Correct 468 ms 18364 KB Output is correct
16 Correct 25 ms 6396 KB Output is correct
17 Correct 567 ms 18464 KB Output is correct
18 Correct 60 ms 7704 KB Output is correct
19 Correct 875 ms 39276 KB Output is correct
20 Correct 494 ms 19920 KB Output is correct
21 Correct 36 ms 6080 KB Output is correct
22 Correct 28 ms 6356 KB Output is correct
23 Correct 43 ms 7340 KB Output is correct
24 Correct 513 ms 23412 KB Output is correct
25 Correct 832 ms 33872 KB Output is correct
26 Correct 896 ms 48960 KB Output is correct
27 Correct 778 ms 47992 KB Output is correct
28 Correct 26 ms 5704 KB Output is correct
29 Correct 29 ms 5868 KB Output is correct
30 Correct 26 ms 6136 KB Output is correct
31 Correct 26 ms 6260 KB Output is correct
32 Correct 41 ms 6312 KB Output is correct
33 Correct 62 ms 7660 KB Output is correct
34 Correct 636 ms 30304 KB Output is correct
35 Correct 986 ms 41520 KB Output is correct
36 Correct 30 ms 6124 KB Output is correct
37 Correct 34 ms 6912 KB Output is correct
38 Correct 857 ms 46552 KB Output is correct
39 Correct 828 ms 47800 KB Output is correct
40 Correct 884 ms 46468 KB Output is correct
41 Correct 832 ms 47736 KB Output is correct
42 Correct 853 ms 46676 KB Output is correct
43 Correct 432 ms 17864 KB Output is correct
44 Correct 844 ms 38176 KB Output is correct
45 Correct 465 ms 18920 KB Output is correct
46 Correct 1006 ms 41588 KB Output is correct
47 Correct 30 ms 6088 KB Output is correct
48 Correct 30 ms 6460 KB Output is correct
49 Correct 37 ms 7308 KB Output is correct
50 Correct 112 ms 11300 KB Output is correct
51 Correct 482 ms 21052 KB Output is correct
52 Correct 669 ms 29908 KB Output is correct
53 Correct 640 ms 27964 KB Output is correct
54 Correct 701 ms 34184 KB Output is correct
55 Correct 714 ms 33068 KB Output is correct
56 Correct 834 ms 37604 KB Output is correct
57 Correct 829 ms 42212 KB Output is correct
58 Correct 757 ms 42832 KB Output is correct
59 Correct 829 ms 46500 KB Output is correct
60 Correct 846 ms 47900 KB Output is correct