Submission #1265762

#TimeUsernameProblemLanguageResultExecution timeMemory
1265762canhnam357Bitaro’s Party (JOI18_bitaro)C++20
100 / 100
1197 ms239728 KiB
#include <bits/stdc++.h>
using namespace std;
#define N 100'001
int dp[N], mark[N]{};
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m, q;
    cin >> n >> m >> q;
    vector<pair<int, int>> e(m);
    vector<vector<int>> adj(n + 1);
    for (auto &[u, v] : e) cin >> v >> u, adj[u].push_back(v);
    sort(e.rbegin(), e.rend());
    const int B = 100;
    vector<vector<pair<int, int>>> p(n + 1);
    int timer = 0;
    for (int i = 1; i <= n; i++) {
        timer++;
        p[i].emplace_back(0, i);
        for (int v : adj[i]) {
            for (auto [d, id] : p[v]) {
                p[i].emplace_back(d + 1, id);
            }
        }
        sort(p[i].rbegin(), p[i].rend());
        int l = 0;
        for (int r = 0; r < p[i].size() && l < B; r++) {
            if (mark[p[i][r].second] != timer) {
                p[i][l++] = p[i][r];
                mark[p[i][r].second] = timer;
            }
        }
        while (p[i].size() > l) p[i].pop_back();
    }
    while (q--) {
        timer++;
        int t;
        cin >> t;
        int k;
        cin >> k;
        vector<int> c(k);
        for (int &i : c) cin >> i;
        while (k > 0 && c[k - 1] > t) {
            c.pop_back();
            k--;
        }
        for (int i : c) mark[i] = timer;
        if (k >= B) {
            memset(dp, -1, sizeof dp);
            dp[t] = 0;
            for (auto [u, v] : e) {
                if (dp[u] >= 0) {
                    dp[v] = max(dp[v], dp[u] + 1);
                }
            }
            int ans = -1, j = 0;
            for (int i = 1; i <= n; i++) {
                if (j < k && c[j] == i) j++;
                else if (dp[i] >= 0) {
                    ans = max(ans, dp[i]);
                }
            }
            cout << ans << '\n';
        }
        else {
            int ans = -1;
            for (auto [d, id] : p[t]) {
                if (mark[id] != timer) {
                    ans = d;
                    break;
                }
            }
            cout << ans << '\n';
        }
    }   
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...