Submission #1085310

# Submission time Handle Problem Language Result Execution time Memory
1085310 2024-09-07T23:39:15 Z eysbutno Bitaro’s Party (JOI18_bitaro) C++17
7 / 100
2000 ms 7040 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = array<int, 2>;
#define all(x) begin(x), end(x)
#define sz(x) (int) (x).size()

constexpr int B = (int) sqrt(100'000);
int main() {
    cin.tie(0) -> sync_with_stdio(0);
    int n, m, q;
    cin >> n >> m >> q;
    vector<vector<int>> adj(n);
    vector<int> deg(n);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        adj[u].push_back(v);
        ++deg[v];
    }
    vector<vector<pii>> best(n);
    auto cur = deg;
    queue<int> top;
    for (int i = 0; i < n; i++) {
        if (!cur[i]) { top.push(i); }
    }
    const auto merge = [&](int from, int to) -> void {
        map<int, int> mp;
        for (auto [node, dist] : best[from]) {
            mp[node] = max(mp[node], dist + 1);
        }
        for (auto [node, dist] : best[to]) {
            mp[node] = max(mp[node], dist);
        }
        best[to].clear();
        for (auto [node, dist] : mp) {
            best[to].push_back({node, dist});
        }
        sort(all(best[to]), [&](auto &x, auto &y) -> bool {
            return x[1] > y[1];
        });
        if (sz(best[to]) > B) { best[to].resize(B); }
    };
    while (!top.empty()) {
        int u = top.front(); top.pop();
        if (sz(best[u]) < B) {
            best[u].push_back({u, 0});
        }
        for (int v : adj[u]) {
            merge(u, v);
            if (!(--cur[v])) { top.push(v); }
        }
    }
    const auto check = [&](int t, const set<int> &bad) -> int {
        for (auto [node, dist] : best[t]) {
            if (!bad.count(node)) {
                return dist;
            }
        }
        return -1;
    };
    const auto brute_force = [&](int t, const set<int> &bad) -> int {
        queue<int> q;
        auto cur = deg;
        vector<int> best(n, -1);
        for (int i = 0; i < n; i++) {
            if (!cur[i]) { q.push(i); }
        }
        while (!q.empty()) {
            int u = q.front(); q.pop();
            if (!bad.count(u)) { best[u] = max(0, best[u]); }
            if (u == t) { break; }
            for (int v : adj[u]) {
                if (best[u] != -1) { best[v] = max(best[v], best[u] + 1); }
                if (!--cur[v]) { q.push(v); }
            }
        }
        return best[t];
    };
    while (q--) {
        int t, y;
        cin >> t >> y;
        --t;
        set<int> bad;
        for (int i = 0; i < y; i++) {
            int x; cin >> x;
            bad.insert(--x);
        }
        if (y >= B) {
            cout << brute_force(t, bad) << "\n";
        } else {
            cout << check(t, bad) << "\n";
        }
    }
    /*
    for (int i = 0; i < n; i++) {
        cout << "node " << i + 1 << "\n";
        for (auto [node, dist] : best[i]) {
            cout << node + 1 << " " << dist << "\n";
        }
    }
    */
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 860 KB Output is correct
6 Correct 6 ms 860 KB Output is correct
7 Correct 6 ms 860 KB Output is correct
8 Correct 34 ms 4076 KB Output is correct
9 Correct 32 ms 3932 KB Output is correct
10 Correct 32 ms 3884 KB Output is correct
11 Correct 35 ms 3676 KB Output is correct
12 Correct 20 ms 1884 KB Output is correct
13 Correct 35 ms 3568 KB Output is correct
14 Correct 30 ms 2612 KB Output is correct
15 Correct 27 ms 1368 KB Output is correct
16 Correct 31 ms 2356 KB Output is correct
17 Correct 28 ms 2908 KB Output is correct
18 Correct 22 ms 1788 KB Output is correct
19 Correct 30 ms 2948 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 860 KB Output is correct
6 Correct 6 ms 860 KB Output is correct
7 Correct 6 ms 860 KB Output is correct
8 Correct 34 ms 4076 KB Output is correct
9 Correct 32 ms 3932 KB Output is correct
10 Correct 32 ms 3884 KB Output is correct
11 Correct 35 ms 3676 KB Output is correct
12 Correct 20 ms 1884 KB Output is correct
13 Correct 35 ms 3568 KB Output is correct
14 Correct 30 ms 2612 KB Output is correct
15 Correct 27 ms 1368 KB Output is correct
16 Correct 31 ms 2356 KB Output is correct
17 Correct 28 ms 2908 KB Output is correct
18 Correct 22 ms 1788 KB Output is correct
19 Correct 30 ms 2948 KB Output is correct
20 Execution timed out 2025 ms 7040 KB Time limit exceeded
21 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 860 KB Output is correct
6 Correct 6 ms 860 KB Output is correct
7 Correct 6 ms 860 KB Output is correct
8 Correct 34 ms 4076 KB Output is correct
9 Correct 32 ms 3932 KB Output is correct
10 Correct 32 ms 3884 KB Output is correct
11 Correct 35 ms 3676 KB Output is correct
12 Correct 20 ms 1884 KB Output is correct
13 Correct 35 ms 3568 KB Output is correct
14 Correct 30 ms 2612 KB Output is correct
15 Correct 27 ms 1368 KB Output is correct
16 Correct 31 ms 2356 KB Output is correct
17 Correct 28 ms 2908 KB Output is correct
18 Correct 22 ms 1788 KB Output is correct
19 Correct 30 ms 2948 KB Output is correct
20 Execution timed out 2025 ms 7040 KB Time limit exceeded
21 Halted 0 ms 0 KB -