Submission #56809

#TimeUsernameProblemLanguageResultExecution timeMemory
56809DiuvenBitaro’s Party (JOI18_bitaro)C++11
14 / 100
2045 ms289760 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MX=100010, inf=2e9, BMX=350;

int n, m, q, b=300;
vector<int> G1[MX], G2[MX];

bool used[MX];
struct bucket {
    pii X[BMX];
    bucket(){
        for(int i=1; i<BMX; i++)
            X[i]={-inf, 0};
    }
    bucket operator + (const bucket& A) const {
        bucket res;
        for(int i=1, p1=1, p2=1; i<=b; i++){
            while(p1<=b && used[X[p1].second]) p1++;
            while(p2<=b && used[A.X[p2].second]) p2++;
            if(p1>b) res.X[i]=A.X[p2++];
            else if(p2>b) res.X[i]=X[p1++];
            else if(X[p1]<A.X[p2]) res.X[i]=A.X[p2++];
            else res.X[i]=X[p1++];
            if(res.X[i].second>0) used[res.X[i].second]=true;
        }
        for(int i=1; i<=b; i++)
            used[res.X[i].second]=false;
        return res;
    }
} V[MX];

bool vis[MX];
void dfs1(int v){
    V[v].X[1]={-1,v};
    vis[v]=true;
    for(int x:G2[v]){
        if(!vis[x]) dfs1(x);
        V[v]=V[v]+V[x];
    }
    for(int i=1; i<=b; i++) V[v].X[i].first++;
}

int D[MX];
bool out[MX];
int dfs2(int v){
    int &res=D[v];
    if(res!=-1) return res;
    res = (out[v] ? -inf : 0);
    for(int x:G2[v]){
        res=max(res, dfs2(x)+1);
    }
    return res;
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m>>q;
    for(int i=1; i<=m; i++){
        int u, v; cin>>u>>v;
        G1[u].push_back(v);
        G2[v].push_back(u);
    }
    for(int i=1; i<=n; i++) if(!vis[i]) dfs1(i);

    for(int i=1; i<=q; i++){
        int v, x; cin>>v>>x;
        vector<int> A;
        for(int i=1; i<=x; i++){
            int a; cin>>a;
            A.push_back(a);
            out[a]=true;
        }
        int ans=-1;
        if(x>=b){
            fill(D, D+n+1, -1);
            ans=max(ans, dfs2(v));
        }
        else{
            pii *P=V[v].X;
            for(int i=1; i<=b; i++){
                if(!out[P[i].second]){
                    ans=max(ans, P[i].first);
                    break;
                }
            }
        }
        cout<<ans<<'\n';
        for(int a:A) out[a]=false;
    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...