Submission #1222100

#TimeUsernameProblemLanguageResultExecution timeMemory
1222100HappyCapybaraBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1501 ms418924 KiB
#include<bits/stdc++.h>
using namespace std;
 
int k = 300;
 
signed main(){
    cin.tie(0);
    iostream::sync_with_stdio(false);
    int n, m, q;
    cin >> n >> m >> q;
    vector<vector<int>> g(n), tg(n);
    for (int i=0; i<m; i++){
        int s, e;
        cin >> s >> e;
        s--; e--;
        g[s].push_back(e);
        tg[e].push_back(s);
    }
    vector<vector<pair<int,int>>> dp(n);
    vector<int> idx(n), flag(n, -1);
    for (int i=0; i<n; i++){
        dp[i].push_back({0, i});
        idx[i] = 0;
        flag[i] = i;
        for (int next : tg[i]){
            for (auto [len, s] : dp[next]){
                if (flag[s] < i){
                    dp[i].push_back({len-1, s});
                    idx[s] = dp[i].size()-1;
                    flag[s] = i;
                }
                else dp[i][idx[s]].first = min(dp[i][idx[s]].first, len-1);
            }
        }
        sort(dp[i].begin(), dp[i].end());
        while (dp[i].size() > k) dp[i].pop_back();
    }
    for (int i=0; i<q; i++){
        int t, y;
        cin >> t >> y;
        t--;
        unordered_set<int> busy;
        for (int j=0; j<y; j++){
            int x;
            cin >> x;
            busy.insert(x-1);
        }
        if (y < k){
            for (int j=0; j<dp[t].size(); j++){
                if (busy.find(dp[t][j].second) == busy.end()){
                    cout << -dp[t][j].first << '\n';
                    break;
                }
                if (j == dp[t].size()-1){
                    cout << -1 << '\n';
                    break;
                }
            }
        }
        else {
            int bsf = -1;
            vector<int> dp2(n, -pow(10, 9));
            for (int cur=n-1; cur>=0; cur--){
                if (cur == t) dp2[cur] = 0;
                if (busy.find(cur) == busy.end()) bsf = max(bsf, dp2[cur]);
                //cout << cur << " " << dp2[cur] << endl;
                for (int next : tg[cur]) dp2[next] = max(dp2[next], dp2[cur]+1);
            }
            cout << bsf << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...