Submission #1320133

#TimeUsernameProblemLanguageResultExecution timeMemory
1320133husseinjuandaBitaro’s Party (JOI18_bitaro)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

int B = 100;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m, q; cin >> n >> m >> q;
    vector<vector<int>> g(n+1);
    for(int i = 0; i < m; i++){
        int a, b; cin >> a >> b;
        // if(a < b){
        //     swap(a, b);
        // }
        g[a].push_back(b);
    }
    vector<vector<pair<int, int>>> path(n+1); //path 
    for(int i = 1; i <= n; i++){
        path[i].push_back({0, i});
        sort(path[i].rbegin(), path[i].rend());
        while(path[i].size() > B){
            path[i].pop_back();
        }
        for(int y = 0; y < g[i].size(); y++){
            for(auto k : path[i]){
                path[g[i][y]].push_back({k.first+1, k.second});
            }
        }
    }
    for(int i = 1; i <= n; i++){
        cout << i << endl;
        for(int y = 0; y < path[i].size(); y++){
            cout << path[i][y].first << " " << path[i][y].second << "\n";
            swap(path[i][y].first, path[i][y].second);
        }
        sort(path[i].begin(), path[i].end());
    }
    while(q--){
        int k; cin >> k;
        int sz; cin >> sz;
        vector<int> j(sz);
        for(int i = 0; i < sz; i++){
            cin >> j[i];
        }
        sort(j.begin(), j.end());
        if(sz >= B){
            vector<int> dp(n+1, 0);
            for(int i = 0; i < sz; i++){
                dp[j[i]] = -1e18;
            }
            for(int i = 1; i < k; i++){
                for(int y = 0; y < g[i].size(); y++){
                    dp[g[i][y]] = max(dp[g[i][y]], dp[i]+1);
                }
            }
            if(dp[k] < 0){
                dp[k] = -1;
            }
            cout << dp[k] << "\n";
        }else{
            int it = 0;
            int mx = -1;
            for(int y = 0; y < j.size(); y++){
                while(it < path[k].size()){
                    if(path[k][it].first == j[y]){
                        it++;
                    }else if(path[k][it].first < j[y]){
                        mx = max(mx, path[k][it].second);
                        it++;
                    }else{
                        break;
                    }
                }
            }
            for(int y = it; y < path[k].size(); y++){
                mx = max(mx, path[k][it].second);
            }
            cout << mx << "\n";
        }
    }
    return 0;
}


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