제출 #1340925

#제출 시각아이디문제언어결과실행 시간메모리
1340925jenterjongle45Bitaro’s Party (JOI18_bitaro)C++20
100 / 100
820 ms451784 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
bool ch[100100];
void merge(vector<pii> &a,vector<pii> &b){
    vector<pii> tmp;
    int i=0,j=0;
    while(i<a.size()&&j<b.size()&&tmp.size()<330){
        if(ch[a[i].second]){
            i++;
            continue;
        }
        if(ch[b[j].second]){
            j++;
            continue;
        }
        if(a[i].first>b[j].first+1) tmp.push_back(a[i]),ch[a[i++].second]=1;
        else tmp.push_back({b[j].first+1,b[j].second}),ch[b[j++].second]=1;
    }
    while(i<a.size()&&tmp.size()<330){
        if(ch[a[i].second]){
            i++;
            continue;
        }
        tmp.push_back(a[i]),ch[a[i++].second]=1;
    }
    while(j<b.size()&&tmp.size()<330){
        if(ch[b[j].second]){
            j++;
            continue;
        }
        tmp.push_back({b[j].first+1,b[j].second}),ch[b[j++].second]=1;
    }
    a=tmp;
    for(auto x:a) ch[x.second]=0;

}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n,m,q;cin>>n>>m>>q;
    vector<vector<int>> rev(n+1);
    vector<vector<pii>> mst(n+1);
    vector<int> dp(n+1,0);
    while(m--){
        int u,v;cin>>u>>v;
        rev[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        mst[i].push_back({0,i});
        for(int x:rev[i]){
            dp[i]=max(dp[i],dp[x]+1);
            mst[i].push_back({1,x});
            merge(mst[i],mst[x]);
        }
    }
    vector<int> ch(n+1);
    while(q--){
        int t,N;cin>>t>>N;
        vector<int> tmp;
        for(int i=0;i<N;i++){
            int x;cin>>x;
            tmp.push_back(x);
            ch[x]=1;
        }
        for(auto x:mst[t]){
            if(!ch[x.second]){
                cout<<x.first<<'\n';
                goto nx;
            }
        }
        for(int i=1;i<=t;i++){
            dp[i]=0;
            if(ch[i]){
                dp[i]=-1;
                continue;
            }
            for(int x:rev[i]){
                if(dp[x]==-1) continue;
                dp[i]=max(dp[i],dp[x]+1);
            }
        }
        cout<<dp[t]<<'\n';
        nx:;
        for(int x:tmp) ch[x]=0;
        tmp.clear();
        
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...