Submission #1274005

#TimeUsernameProblemLanguageResultExecution timeMemory
1274005nanaseyuzukiBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1270 ms411760 KiB
#include <bits/stdc++.h>
// Author: Kazuki_Will_Win_VOI_8703
#define fi first
#define se second
#define pii pair<int, int>
// #define int long long
#define all(a) a.begin(), a.end()
using namespace std;

const int mn = 1e5 + 5, bm = (1 << 11) + 1, mod = 1e9 + 7, offset = 5e4, B = 320 + 5;
const int inf = 1e18, base = 311;

int n, m, q, vst[mn], d[mn], del[mn];
vector <int> a[mn];
vector <pii> f[mn];

void solve(){
    cin >> n >> m >> q;
    for(int i = 1; i <= m; i++){
        int u, v; cin >> u >> v;
        a[v].push_back(u);
    }
    for(int u = 1; u <= n; u++){
        vector <int> cur;
        cur.push_back(u);
        for(auto j : a[u]){
            for(auto [c, v] : f[j]){
                if(!vst[v]){
                    cur.push_back(v);
                    vst[v] = 1;
                }
                d[v] = max(d[v], c + 1);
            }
        }
        for(auto v : cur) f[u].push_back({d[v], v});
        sort(f[u].begin(), f[u].end(), greater <pii>());
        while(f[u].size() > B) f[u].pop_back();
        for(auto v : cur) vst[v] = 0, d[v] = 0;
    }

    while(q--){
        int u, y; cin >> u >> y;
        vector <int> cur;
        for(int i = 1; i <= y; i++){
            int zz; cin >> zz;
            cur.push_back(zz);
            del[zz] = 1;
        }
    
        if(y < B){
            int res = -1;
            for(int i = 0; i < f[u].size(); i++){
                auto [c, v] = f[u][i];
                if(!del[v]){
                    res = c;
                    break;
                }
            }
            cout << res << '\n';
        }
        else{
            // ko qua sqrt(n) truy van
            for(int i = 1; i <= n; i++) d[i] = -2e9;
            for(int i = 1; i <= u; i++){
                if(!del[i]) d[i] = 0;
                for(auto v : a[i]){
                    d[i] = max(d[i], d[v] + 1);
                }
            }
            if(d[u] < 0) cout << -1 << '\n';
            else cout << d[u] << '\n';
        }

        for(auto v : cur) del[v] = 0;
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    // cin >> t;
    while(t--){
        solve();
    }
}

Compilation message (stderr)

bitaro.cpp:11:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   11 | const int inf = 1e18, base = 311;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...