Submission #1301773

#TimeUsernameProblemLanguageResultExecution timeMemory
1301773kiteyuBitaro’s Party (JOI18_bitaro)C++20
0 / 100
8 ms6980 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using ll = long long;
const int N = 1e5;
int n,m,q;
vector<int> adj[N+5];
int d[N+5],qe[N+5],busy[N+5];
bool f[N+5],fbusy[N+5];
int head = 0, tail = 0;

set<pair<int,int>> largest[N+5];

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> m >> q;
    for(int i = 1,x,y; i <= m ; ++i){
        cin >> x >> y;
        adj[y].push_back(x);
    }
    for(int i = 1 ; i <= n ; ++i){
        for(int j : adj[i]){
            d[i] = max(d[i],d[j] + 1);
            for(pair<int,int> j1 : largest[j])
                largest[i].insert(j1);
        }
        largest[i].insert({d[i],i});
//        sort(largest[i].begin(),largest[i].end(),[&](pair<int,int> x, pair<int,int>y){
//            return x.se < y.se;
//        });
        while(largest[i].size() > 100) largest[i].erase((*largest[i].rbegin()));
    }
//    for(int i = 1 ; i <= n ; ++i){
//        cout << i << ":\n";
//        for(auto j : largest[i]) cout << j.fi << ',' << j.se << '\n';
//
//    }

    for(int i = 1 ; i <= q ; ++i){ int t,k;
        cin >> t >> k;
        for(int j = 1 ; j <= k ; ++j) cin >> busy[j], fbusy[busy[j]] = 1;
        bool ok = false;
        for(pair<int,int> j : largest[t]) if(!fbusy[j.se]){
//            cout << j.fi << ',' << j.se << '\n';
            cout << d[t] - j.fi << '\n';
            ok = true;
            break;
        }
        if(!ok){
            head = tail = 0;
            qe[++tail] = t;
            f[t] = 1;
            int ans = -1;
            while(head < tail){
                int u = qe[++head];
//                cout << u << "!" << fbusy[u] << '\n';
                if(!fbusy[u]) {
//                    cout << u << "!\n";
                    ans = max(ans,d[t] - d[u]);
                }
                for(int j : adj[u]) if(!f[j]){
                    f[j] = 1;
                    qe[++tail] = j;
                }
            }
            for(int j = 1 ; j <= tail ; ++j) f[qe[j]] = 0;
            cout << ans << '\n';
        }
        for(int j = 1 ; j <= k ; ++j) fbusy[busy[j]] = 0;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...