Submission #212889

#TimeUsernameProblemLanguageResultExecution timeMemory
212889dolphingarlicBitaro’s Party (JOI18_bitaro)C++14
14 / 100
2103 ms413048 KiB
#include <bits/stdc++.h> #define FOR(i, x, y) for (int i = x; i < y; i++) using namespace std; const int L = 350; vector<int> graph[100001]; vector<pair<int, int>> sqrt_farthest[100001]; int a[100001], dp[100001], deg[100001], deg_cp[100001]; bool bad[100001], in_ret[100001]; vector<pair<int, int>> merge(vector<pair<int, int>> X, vector<pair<int, int>> Y) { vector<pair<int, int>> ret; int xptr = 0; for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) { while (xptr < X.size() && X[xptr].second >= Y[yptr].second) { if (!in_ret[X[xptr].first]) ret.push_back({X[xptr].first, X[xptr].second + 1}); in_ret[X[xptr].first] = true; xptr++; } if (!in_ret[Y[yptr].first]) ret.push_back(Y[yptr]); in_ret[Y[yptr].first] = true; } while (xptr < X.size() && ret.size() <= L) { if (!in_ret[X[xptr].first]) ret.push_back({X[xptr].first, X[xptr].second + 1}); in_ret[X[xptr].first] = true; xptr++; } for (pair<int, int> i : ret) in_ret[i.first] = false; return ret; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, k; cin >> n >> m >> k; FOR(i, 0, m) { int u, v; cin >> u >> v; graph[u].push_back(v); deg[v]++; deg_cp[v]++; } queue<int> q; FOR(i, 1, n + 1) { sqrt_farthest[i] = {{i, 0}}; if (!deg_cp[i]) q.push(i); } while (q.size()) { int curr = q.front(); q.pop(); for (int i : graph[curr]) { sqrt_farthest[i] = merge(sqrt_farthest[curr], sqrt_farthest[i]); deg_cp[i]--; if (!deg_cp[i]) q.push(i); } } while (k--) { int t, y; cin >> t >> y; FOR(i, 0, y) { cin >> a[i]; bad[a[i]] = true; } if (y >= L) { queue<int> q; FOR(i, 1, n + 1) { if (bad[i]) dp[i] = INT_MIN; else dp[i] = 0; deg_cp[i] = deg[i]; if (!deg_cp[i]) q.push(i); } while (q.size()) { int curr = q.front(); q.pop(); for (int i : graph[curr]) { dp[i] = max(dp[i], dp[curr] + 1); deg_cp[i]--; if (!deg_cp[i]) q.push(i); } } cout << max(-1, dp[t]) << '\n'; } else { bool can = false; for (pair<int, int> i : sqrt_farthest[t]) if (!bad[i.first]) { can = true; cout << i.second << '\n'; break; } if (!can) cout << "-1\n"; } FOR(i, 0, y) bad[a[i]] = false; } return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'std::vector<std::pair<int, int> > merge(std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> >)':
bitaro.cpp:15:48: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) {
                                           ~~~~~^~~~~~~~~~
bitaro.cpp:15:67: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) {
                                                              ~~~~~^~~~~~~~~~
bitaro.cpp:16:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (xptr < X.size() && X[xptr].second >= Y[yptr].second) {
                ~~~~~^~~~~~~~~~
bitaro.cpp:24:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (xptr < X.size() && ret.size() <= L) {
            ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...