Submission #1095989

#TimeUsernameProblemLanguageResultExecution timeMemory
1095989mohammad86Bitaro’s Party (JOI18_bitaro)C++17
100 / 100
975 ms327508 KiB
// https://oj.uz/problem/view/JOI18_bitaro #include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int maxn = 1e5 + 100; const int sqrtn = 250; const int inf = 1e9; int n, m, q; vector<int> adj[maxn]; vector<int> readj[maxn]; vector<pii> fv[maxn]; int pointer[maxn]; int dis[maxn]; bool mark[maxn]; bool mark2[maxn]; bool mark3[maxn]; int main () { ios_base::sync_with_stdio(false); cin >> n >> m >> q; for (int i = 1; i <= m; i++) { int s, e; cin >> s >> e; adj[s].push_back(e); readj[e].push_back(s); } /*vector<int> tmp1; for (int i = 1; i <= n; i++) { tmp1.clear(); for (int w = 0; w <= sqrtn; w++) { int maximum = -1; int v = -1; int nv = -1; for (int j : readj[i]) { if (int(fv[j].size()) > pointer[j] && !mark2[fv[j][pointer[j]].second]) { if (fv[j][pointer[j]].first +1 > maximum) { maximum = fv[j][pointer[j]].first +1; v = fv[j][pointer[j]].second; nv = j; } } } if (v == -1) break; mark2[v] = true; tmp1.push_back(v); fv[i].push_back({maximum, v}); pointer[nv]++; } for (int j : readj[i]) pointer[j] = 0; for (int j : tmp1) { mark2[j] = false; } fv[i].push_back({0, i}); }*/ for (int i = 1; i <= n; i++) { fv[i].push_back(pii(0, i)); for (auto &j : readj[i]) { vector<pii> nxt = fv[j]; vector<pii> prv = fv[i]; fv[i].clear(); int ptr = 0; for (auto &k : nxt) { k.first++; while (ptr < prv.size() && prv[ptr].first >= k.first) { if (mark3[prv[ptr].second]) { ptr++; continue; } mark3[prv[ptr].second] = 1; fv[i].push_back(prv[ptr++]); } if (mark3[k.second]) { continue; } mark3[k.second] = 1; fv[i].push_back(k); } while (ptr < prv.size()) { if (mark3[prv[ptr].second]) { ptr++; continue; } mark3[prv[ptr].second] = 1; fv[i].push_back(prv[ptr++]); } for (auto &i : nxt) { mark3[i.second] = 0; } for (auto &i : prv) { mark3[i.second] = 0; } while (fv[i].size() > sqrtn) { fv[i].pop_back(); } } } vector<int> tmp; for (int _ = 1; _ <= q; _++) { int t, y; cin >> t >> y; tmp.clear(); for (int i = 0; i < y; i++) { int c; cin >> c; tmp.push_back(c); mark[c] = true; } if (y < sqrtn) { bool is_find = false; for (pii i : fv[t]) { if (!mark[i.second]) { cout << i.first << endl; is_find = true; break; } } if (!is_find) { cout << -1 << endl; } } else { fill(dis, dis+n+2, -1 * inf); dis[t] = 0; for (int i = t; i >= 1; i--) { for (int j : readj[i]) { dis[j] = max(dis[j], dis[i]+1); } } int ans = -1; for (int i= 1; i <= t; i++) { if (!mark[i]) { ans = max(ans, dis[i]); } } cout << ans << endl; } for (int i : tmp) { mark[i] = false; } } }

Compilation message (stderr)

bitaro.cpp: In function 'int main()':
bitaro.cpp:72:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |                 while (ptr < prv.size() && prv[ptr].first >= k.first) {
      |                        ~~~~^~~~~~~~~~~~
bitaro.cpp:86:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             while (ptr < prv.size()) {
      |                    ~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...