Submission #871977

#TimeUsernameProblemLanguageResultExecution timeMemory
871977LOLOLOBitaro’s Party (JOI18_bitaro)C++17
0 / 100
4 ms7000 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define           f     first
#define           s     second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())

const int N = 1e5 + 100;
const int block = 300;

vector <int> ed[N];
vector <pair <int, int>> dp[N];
int mx[N];

void dfs(int u) {
    if (dp[u].size())
        return;

    vector <int> lst;
    lst.pb(u);
    mx[u] = 0;

    for (auto x : ed[u]) {
        dfs(x);
        for (auto t : dp[x]) {
            if (mx[t.s] == -1)
                lst.pb(t.s);

            mx[t.s] = max(mx[t.s], t.f + 1);
        }
    }

    for (auto x : lst) {
        dp[u].pb({mx[x], x});
        mx[x] = -1;
    }

    sort(all(dp[u]), greater <pair <int, int>> ());
    while (sz(dp[u]) > block)
        dp[u].pop_back();
}

int f[N], busy[N], used[N];

ll cal(int u) {
    if (busy[u] && ed[u].empty())
        return -1;

    if (used[N])
        return f[u];

    f[u] = -1;
    for (auto x : ed[u]) {
        int nxt = cal(x);
        if (nxt == -1)
            continue;


        f[u] = max(f[u], nxt + 1);
    }

    used[u] = 1;
    return f[u];
}

ll solve() {
    int n, m, q;
    cin >> n >> m >> q;

    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        ed[b].pb(a);
    }

    for (int i = 1; i <= n; i++) {
        if (dp[i].empty()) {
            dfs(i);
        }
    }

    for (int i = 1; i <= q; i++) {
        int t, y;
        cin >> t >> y;

        vector <int> lst(y);
        for (auto &x : lst) {
            cin >> x;
            busy[x] = 1;
        }

        if (y >= block) {
            mem(used, 0);
            cout << cal(t) << '\n';
        } else {
            int ans = -1;
            for (auto x : dp[t]) {
                if (busy[x.s] == 0) {
                    ans = x.f;
                    break;
                }
            }

            cout << ans << '\n';
        }

        for (auto x : lst) {
            busy[x] = 0;
        }
    }

    return 0;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    mem(mx, -1);
    int t = 1;
    //cin >> t;

    while (t--) {
        solve();
        //cout << solve() << '\n';
    }
}

Compilation message (stderr)

bitaro.cpp: In function 'll cal(int)':
bitaro.cpp:64:15: warning: array subscript 100100 is above array bounds of 'int [100100]' [-Warray-bounds]
   64 |     if (used[N])
      |         ~~~~~~^
bitaro.cpp:58:20: note: while referencing 'used'
   58 | int f[N], busy[N], used[N];
      |                    ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...