Submission #656102

#TimeUsernameProblemLanguageResultExecution timeMemory
656102mhn2Bitaro’s Party (JOI18_bitaro)C++17
0 / 100
32 ms14064 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define piii pair<pii, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; const int N = 1e5+5, SQ = 320, INF = 1e9; int n, m, q; int qt[N], mxy[N], dt[N], sn[N]; vector<int> g1[N], g2[N], qc[N]; vector<pii> mx[N]; list<pii> ls; list<pii>::iterator ps[N]; void dist(int r) { for (int i = 1; i <= n; i++) dt[i] = -INF; dt[r] = 0; for (int i = r-1; i > 0; i--) { for (int u : g1[i]) dt[i] = max(dt[i], dt[u]); dt[i]++; } } vector<pii> merge(vector<vector<pii>> a, int tm) { vector<pii> o, b, c; ls.clear(); int r = INF; for (int i = 0; i < a.size(); i++) b.push_back({a[i].back().F, i}); sort(b.begin(), b.end()); for (int sib = b.size()-1; sib > -1; sib--) { int i = b[sib].S; if (b[sib].F < r) { for (int j = a[i].size()-1; j > -1; j--) { ls.push_front(a[i][j]); ps[a[i][j].F] = ls.begin(); r = a[i][j].F; } continue; } for (int j = a[i].size()-1; j > -1; j--) { int x = a[i][j].F; ps[x] = ls.insert(ps[x], a[i][j]); r = min(r, x); if (x > 0 && x == r) ps[x-1] = ps[x]; } } for (auto it = ls.begin(); it != ls.end(); it++) c.push_back(*it); for (int i = c.size()-1; i > -1; i--) { if (o.size() > SQ+3) break; if (sn[c[i].S] < tm) { o.push_back({c[i].F+1, c[i].S}); sn[c[i].S] = tm; } } reverse(o.begin(), o.end()); return o; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m >> q; while (m--) { int u, v; cin >> u >> v; g1[u].push_back(v); g2[v].push_back(u); } for (int i = 0; i < q; i++) { int y, z; cin >> qt[i] >> y; while (y--) { cin >> z; qc[i].push_back(z); } mxy[qt[i]] = max(mxy[qt[i]], y); } mx[1].push_back({1, 1}); for (int i = 2; i <= n; i++) mx[i].push_back({0, i}); for (int i = 2; i <= n; i++) { if (g2[i].size() == 0) continue; vector<vector<pii>> a; a.push_back(mx[i]); for (int v : g2[i]) a.push_back(mx[v]); mx[i] = merge(a, i); } for (int i = 0; i < q; i++) { if (mxy[qt[i]] > SQ) { dist(qt[i]); int ans = -1, k = 0; for (int j = 1; j <= qt[i]; j++) { if (k < qc[i].size() && j == qc[i][k]) { k++; continue; } ans = max(dt[j], ans); } cout << ans << endl; } set<int> s; for (int x : qc[i]) s.insert(x); int ans = -1, k = qc[i].size()-1; for (int j = mx[qt[i]].size()-1; j > -1; j--) { if (s.find(mx[qt[i]][j].S) == s.end()) { ans = mx[qt[i]][j].F - 1; break; } k--; } cout << ans << endl; } }

Compilation message (stderr)

bitaro.cpp: In function 'std::vector<std::pair<int, int> > merge(std::vector<std::vector<std::pair<int, int> > >, int)':
bitaro.cpp:35:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     for (int i = 0; i < a.size(); i++)
      |                     ~~^~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:114:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |                 if (k < qc[i].size() && j == qc[i][k]) {
      |                     ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...