Submission #1052972

#TimeUsernameProblemLanguageResultExecution timeMemory
1052972fryingducBitaro’s Party (JOI18_bitaro)C++17
100 / 100
919 ms517204 KiB
#include "bits/stdc++.h"
using namespace std;

#define int long long

const int maxn = 1e5 + 5;
const int B = 200;
int n, m, q;
vector<int> g[maxn];
vector<pair<int, int>> lp[maxn];
int del[maxn], d[maxn], mx[maxn][2];
void solve() {
    cin >> n >> m >> q;
    for(int i = 1; i <= m; ++i) {
        int u, v; cin >> v >> u;
        g[u].push_back(v);
    }
    memset(mx, 0, sizeof(mx));
    for(int i = 1; i <= n; ++i) {
        vector<int> cur;
        for(auto v:g[i]) {
            for(auto j:lp[v]) {
                int w = j.first, oe = j.second;
                if(mx[oe][1] != i) {
                    cur.push_back(oe);
                    mx[oe][1] = i;
                    mx[oe][0] = w + 1;
                }
                else {
                    mx[oe][0] = max(mx[oe][0], w + 1);
                }
            }
        }
        for(auto j:cur) {
            lp[i].push_back({mx[j][0], j});
        }
        lp[i].push_back({0, i});
        sort(lp[i].begin(), lp[i].end(), greater<pair<int, int>>());
        while((int)lp[i].size() > B) {
            lp[i].pop_back();
        }
    }
    while(q--) {
        int sz, x; cin >> x >> sz;
        vector<int> cur;
        for(int i = 1; i <= sz; ++i) {
            int u; cin >> u;
            cur.push_back(u);
            del[u] = 1;
        }
        if(sz >= B) {
            for(int i = 0; i <= n; ++i) d[i] = -1;
            for(int i = 1; i <= x; ++i) {
                if(!del[i]) d[i] = 0;
                for(auto u:g[i]) {
                    if(d[u] != -1) d[i] = max(d[i], d[u] + 1);
                }
            }
            
            cout << d[x] << '\n';
        }
        else {
            int res = -1;
            for(int i = 0; i < (int)lp[x].size(); ++i) {
                if(!del[lp[x][i].second]) {
                    res = lp[x][i].first;
                    break;
                }
            }
            
            cout << res << '\n';
        }
        
        for(auto &i:cur) del[i] = 0;
    }
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...