답안 #681529

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
681529 2023-01-13T09:13:39 Z nutella Collapse (JOI18_collapse) C++17
5 / 100
15000 ms 81332 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) {
    vector<Edge> nxt;
    for (auto &ed: e) {
        if (ed.l >= rx || ed.r <= lx) {
        } else {
            nxt.push_back(ed);
        }
    }
    swap(e, nxt);

    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<pair<int, int>> done;
    for (auto [l, r, u, v, w, x, y]: e) {
        if (l <= lx && rx <= r && d1.unite(u, v)) {
            done.emplace_back(x, 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 {
        vector<int> id(sz);
        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 (auto [l, 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 3540 KB Output is correct
2 Correct 3 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 20 ms 3540 KB Output is correct
6 Correct 35 ms 4852 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 5 ms 3468 KB Output is correct
9 Correct 543 ms 5572 KB Output is correct
10 Correct 485 ms 5552 KB Output is correct
11 Correct 217 ms 6204 KB Output is correct
12 Correct 243 ms 6220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 5796 KB Output is correct
2 Correct 25 ms 6268 KB Output is correct
3 Correct 441 ms 20516 KB Output is correct
4 Correct 25 ms 6356 KB Output is correct
5 Correct 568 ms 20572 KB Output is correct
6 Correct 57 ms 8104 KB Output is correct
7 Correct 820 ms 44644 KB Output is correct
8 Correct 13253 ms 25960 KB Output is correct
9 Correct 28 ms 7340 KB Output is correct
10 Correct 78 ms 18560 KB Output is correct
11 Correct 5161 ms 38788 KB Output is correct
12 Execution timed out 15032 ms 68120 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 5704 KB Output is correct
2 Correct 26 ms 5876 KB Output is correct
3 Correct 34 ms 6256 KB Output is correct
4 Correct 26 ms 6260 KB Output is correct
5 Correct 31 ms 6320 KB Output is correct
6 Correct 60 ms 7916 KB Output is correct
7 Correct 603 ms 36328 KB Output is correct
8 Correct 1860 ms 47852 KB Output is correct
9 Correct 41 ms 7368 KB Output is correct
10 Correct 4120 ms 35796 KB Output is correct
11 Execution timed out 15069 ms 81332 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 3540 KB Output is correct
2 Correct 3 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 20 ms 3540 KB Output is correct
6 Correct 35 ms 4852 KB Output is correct
7 Correct 3 ms 2900 KB Output is correct
8 Correct 5 ms 3468 KB Output is correct
9 Correct 543 ms 5572 KB Output is correct
10 Correct 485 ms 5552 KB Output is correct
11 Correct 217 ms 6204 KB Output is correct
12 Correct 243 ms 6220 KB Output is correct
13 Correct 25 ms 5796 KB Output is correct
14 Correct 25 ms 6268 KB Output is correct
15 Correct 441 ms 20516 KB Output is correct
16 Correct 25 ms 6356 KB Output is correct
17 Correct 568 ms 20572 KB Output is correct
18 Correct 57 ms 8104 KB Output is correct
19 Correct 820 ms 44644 KB Output is correct
20 Correct 13253 ms 25960 KB Output is correct
21 Correct 28 ms 7340 KB Output is correct
22 Correct 78 ms 18560 KB Output is correct
23 Correct 5161 ms 38788 KB Output is correct
24 Execution timed out 15032 ms 68120 KB Time limit exceeded
25 Halted 0 ms 0 KB -