Submission #1359231

#TimeUsernameProblemLanguageResultExecution timeMemory
1359231njoopBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2098 ms223444 KiB
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> g, rg;
vector<set<pair<int, int>>> path;
vector<int> dp, mark;
int n, m, q;

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> q;
    g.assign(n+2, vector<int>());
    rg.assign(n+2, vector<int>());
    path.assign(n+2, set<pair<int, int>>());
    mark.assign(n+2, 0);
    while(m--) {
        int u, v;
        cin >> u >> v;
        if(u > v) swap(u, v);
        g[u].push_back(v);
        rg[v].push_back(u);
    }
    for(int i=1; i<=n; i++) {
        path[i].insert({0, i});
        map<int, int> fr;
        fr[i] = 0;
        for(auto j: rg[i]) {
            for(auto k: path[j]) {
                if(fr.find(k.second) == fr.end()) {
                    path[i].insert({k.first+1, k.second});
                    fr[k.second] = k.first+1;
                } else if(fr[k.second] < k.first+1) {
                    path[i].erase({fr[k.second], k.second});
                    path[i].insert({k.first+1, k.second});
                    fr[k.second] = k.first+1;
                }
            }
        }
        while(path[i].size() > 100) {
            path[i].erase(path[i].begin());
        }
    }
    while(q--) {
        int t, y;
        set<int> blk;
        cin >> t >> y;
        for(int i=1; i<=y; i++) {
            int in;
            cin >> in;
            mark[in] = 1;
            blk.insert(in);
        }
        if(y >= 100) {
            dp.assign(n+2, -1);
            for(int i=1; i<=t; i++) {
                if(mark[i] == 0) dp[i] = max(dp[i], 0);
                if(dp[i] == -1) continue;
                for(auto j: g[i]) {
                    dp[j] = max(dp[j], dp[i]+1);
                }
            }
            cout << dp[t] << "\n";
        } else {
            set<pair<int, int>> s = path[t];
            while(!s.empty()) {
                auto x = *s.rbegin();
                if(blk.find(x.second) == blk.end()) {
                    cout << x.first << "\n";
                    break;
                }
                if(s.size() > 1) s.erase(prev(s.end()));
                else s.erase(s.begin());
            }
            if(s.empty()) {
                cout << "-1\n";
            }
        }
        for(auto i: blk) mark[i] = 0;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...