Submission #117574

#TimeUsernameProblemLanguageResultExecution timeMemory
117574PeppaPigBitaro’s Party (JOI18_bitaro)C++14
14 / 100
2069 ms415068 KiB
#include <bits/stdc++.h> #define pii pair<int, int> #define x first #define y second using namespace std; const int N = 1e5+5; const int B = 320; int n, m, q; vector<int> g[N]; int dp[N], chk[N]; void bruteforce(vector<int>& block) { fill_n(dp, N, -1e9); for(int i : block) chk[i] = 1; for(int u = 1; u <= n; u++) { if(!chk[u]) dp[u] = max(dp[u], 0); if(dp[u] == -1e9) continue; for(int v : g[u]) dp[v] = max(dp[v], dp[u] + 1); } for(int i : block) chk[i] = 0; } int mx[N]; vector<pii> pre[N]; void pre_process() { fill_n(mx, N, -1); for(int i = 1; i <= n; i++) pre[i].emplace_back(0, i); for(int u = 1; u <= n; u++) { vector<pii> tmp; for(pii p : pre[u]) tmp.emplace_back(p.x + 1, p.y); for(int v : g[u]) { vector<pii> ret; for(pii p : tmp) mx[p.y] = max(mx[p.y], p.x); for(pii p : pre[v]) mx[p.y] = max(mx[p.y], p.x); int l = 0, r = 0; while(l < tmp.size() && r < pre[v].size()) { pii a = tmp[l], b = pre[v][r]; if(a > b) ret.emplace_back(a), l++; else ret.emplace_back(b), r++; } while(l < tmp.size()) { pii a = tmp[l]; ret.emplace_back(a), l++; } while(r < pre[v].size()) { pii b = pre[v][r]; ret.emplace_back(b), r++; } pre[v].clear(); for(pii p : ret) if(p.x == mx[p.y]) { mx[p.y] = -1; pre[v].emplace_back(p); } while(pre[v].size() > B) pre[v].pop_back(); } } } int main() { scanf("%d %d %d", &n, &m, &q); for(int i = 1, a, b; i <= m; i++) { scanf("%d %d", &a, &b); g[a].emplace_back(b); } pre_process(); for(int x = 1, t, y; x <= q; x++) { vector<int> block; scanf("%d %d", &t, &y); for(int i = 1, a; i <= y; i++) { scanf("%d", &a); block.emplace_back(a); } if(y >= B) { bruteforce(block); if(dp[t] == -1e9) printf("-1\n"); else printf("%d\n", dp[t]); } else { bool valid = false; for(int i : block) chk[i] = 1; for(pii p : pre[t]) if(!chk[p.y]) { printf("%d\n", p.x); valid = true; break; } if(!valid) printf("-1\n"); for(int i : block) chk[i] = 0; } } return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'void pre_process()':
bitaro.cpp:44:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size() && r < pre[v].size()) {
                   ~~^~~~~~~~~~~~
bitaro.cpp:44:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size() && r < pre[v].size()) {
                                     ~~^~~~~~~~~~~~~~~
bitaro.cpp:49:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size()) {
                   ~~^~~~~~~~~~~~
bitaro.cpp:53:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(r < pre[v].size()) {
                   ~~^~~~~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &m, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:76:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &t, &y);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:78:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &a);
             ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...