Submission #930188

#TimeUsernameProblemLanguageResultExecution timeMemory
930188asdasdqwerBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1261 ms377836 KiB
#include <bits/stdc++.h>
using namespace std;

#define MAXN 450
#define UPPER 100003
#define pii array<int,2>

int val[UPPER], dp[UPPER];
vector<int> g[UPPER], bucket[UPPER], rev[UPPER];
vector<pii> pref[UPPER];
bool seen[UPPER], seen1[UPPER];
int MX[UPPER];


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    for (int i=0;i<UPPER;i++) {
        MX[i] = -1;
    }

    int n,m,q;cin>>n>>m>>q;
    for (int i=0;i<m;i++) {
        int a,b;cin>>a>>b;a--;b--;
        g[a].push_back(b);
        rev[b].push_back(a);
    }

    // precalc
    for (int i=0;i<n;i++) {
        vector<int> idx = {i};
        MX[i] = 0;
        for (int x:rev[i]) {
            for (auto y:pref[x]) {
                MX[y[0]] = max(MX[y[0]], y[1]+1);
                if (!seen1[y[0]]) {
                    seen1[y[0]] = true;
                    idx.push_back(y[0]);
                }
            }
        }

        // bucket sort
        int mx = 0;
        for (auto &x:idx) {
            mx = max(mx, MX[x]);
            bucket[MX[x]].push_back(x);
        }

        vector<pii> tmp;
        int cnt=0;
        for (int j=mx;j>=0;j--) {
            for (auto x:bucket[j]) {
                if (!seen[x]) {
                    seen[x] = true;
                    tmp.push_back({x, j});
                    cnt++;
                    if (cnt == MAXN) break;
                }
            }

            if (cnt == MAXN) break;
        }

        for (auto &x:idx) {
            bucket[MX[x]].clear();
            MX[x] = -1;
            seen1[x] = false;
        }

        pref[i] = tmp;

        for (auto x:tmp) {
            seen[x[0]]=false;
        }
    }

    for (int i=0;i<q;i++) {
        int t,y;cin>>t>>y;
        for (int i=0;i<y;i++){cin>>val[i];val[i]--;seen[val[i]]=true;}
        t--;
        bool found = false;

        for (auto x:pref[t]) {
            if (!seen[x[0]]) {
                cout<<x[1]<<"\n";
                found = true;
                break;
            }
        }

        if (!found && pref[t].size() >= MAXN) {
            for (int i=0;i<n;i++) {
                dp[i] = 0;
            }
            
            for (int i=0;i<n;i++) {
                if (seen[i]) continue;
                for (int x:g[i]) {
                    dp[x] = max(dp[x], dp[i]+1);
                }
            }

            if (dp[t] != 0 || !seen[t]) {
                cout<<dp[t]<<"\n";
            }

            else {
                cout<<"-1\n";
            }
        }

        else if (!found) {
            cout<<-1<<"\n";
        }

        for (int i=0;i<y;i++) {
            seen[val[i]] = false;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...