Submission #1031446

#TimeUsernameProblemLanguageResultExecution timeMemory
1031446vjudge1Bitaro’s Party (JOI18_bitaro)C++17
0 / 100
5 ms8284 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10,b = 317;

int n,m,q,dp[maxn];
bool ocup[maxn];
vector<int> g[2][maxn];
vector<pair<int,int>> dist[maxn];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> n >> m >> q;
    
    for(int i = 1;i <= m;i++){
        int u,v;
        cin >> u >> v;
        g[0][u].push_back(v);
        g[1][v].push_back(u);
    }
    
    memset(dp,-1,sizeof dp);
    
    for(int i = 1;i <= n;i++){
        dist[i].push_back({0,i});
        vector<int> calc;
        for(int v : g[1][i])
            for(auto [d,w] : dist[v]){
                if(dp[w] == -1){
                    calc.push_back(w);
                    dp[w] = d + 1;
                }
                else dp[w] = max(dp[w],d + 1);
            }
        
        for(int j : calc){ 
            dist[i].push_back({dp[j],j});
            dp[j] = -1;
        }
        
        sort(dist[i].begin(),dist[i].end(),greater<>());
        
        while((int) dist[i].size() > b) dist[i].pop_back();
    }
    
    while(q--){
        int l,k,resp = -1;
        
        cin >> l >> k;
        
        vector<int> calc(k + 5);
        
        for(int i = 1;i <= k;i++){
            cin >> calc[i];
            ocup[calc[i]] = 1;
        }
        
        if(k < b){
            for(auto [d,i] : dist[l])
                if(!ocup[i])
                    resp = max(resp,d);
        }
        else{
            for(int u = 1;u <= l;u++)
                dp[u] = 0;
            
            for(int u = l;u > 0;u--){
                for(int v : g[1][u]){
                    dp[v] = max(dp[v],dp[u] + 1);
                    if(!ocup[v]) resp = max(resp,dp[v]);
                }
            }
        }
        
        cout << resp << "\n";
        
        for(int i : calc)
            ocup[i] = 0;
        
    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...