Submission #479705

#TimeUsernameProblemLanguageResultExecution timeMemory
479705MilosMilutinovicBitaro’s Party (JOI18_bitaro)C++14
7 / 100
2087 ms15624 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int M = 700; vector<int> g[N], rg[N]; vector<pair<int, int>> all[N]; bool can[N]; int qId[N], dp[N]; bool taken[N]; void combine(int u, int v) { int n = all[u].size(), m = all[v].size(); int x = 0, y = 0; vector<pair<int, int>> edg; while (x < n || y < m) { if (edg.size() + 1 > M) break; if (x < n && taken[all[u][x].second]) { x++; continue; } if (y < m && taken[all[v][y].second]) { y++; continue; } if (y >= m || (x < n && all[u][x].first > all[v][y].first + 1)) { edg.push_back({all[u][x].first, all[u][x].second}); taken[all[u][x].second] = true; x++; } else { edg.push_back({all[v][y].first + 1, all[v][y].second}); taken[all[v][y].second] = true; y++; } } for (int i = 0; i < edg.size(); i++) { taken[edg[i].second] = false; // if (i > 0) { // assert(edg[i].first <= edg[i - 1].first); // } } all[u] = edg; } void dfs1(int u) { for (int v : rg[u]) { dp[v] = max(dp[v], dp[u] + 1); } for (int v : rg[u]) { dfs1(v); } } int main() { int n, m, q; scanf("%d%d%d", &n, &m, &q); for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); --u; --v; g[u].push_back(v); rg[v].push_back(u); } for (int i = 0; i < n; i++) { taken[i] = false; } for (int u = 0; u < n; u++) { all[u].push_back({0, u}); for (int v : rg[u]) { combine(u, v); } } for (int i = 0; i < n; i++) can[i] = true; for (int i = 0; i < n; i++) sort(g[i].begin(), g[i].end()); for (int i = 0; i < n; i++) sort(rg[i].rbegin(), rg[i].rend()); while (q--) { int st, qSz; scanf("%d%d", &st, &qSz); --st; for (int i = 0; i < qSz; i++) { scanf("%d", &qId[i]); --qId[i]; can[qId[i]] = false; } if (qSz >= M - 5) { for (int i = 0; i < n; i++) dp[i] = 0; dfs1(st); int ans = -1; for (int i = 0; i < n; i++) { if (can[i]) ans = max(ans, dp[i]); else can[i] = true; } printf("%d\n", ans); } else { int ans = -1; for (auto d : all[st]) { if (can[d.second]) { ans = max(ans, d.first); } } for (int i = 0; i < qSz; i++) can[qId[i]] = true; printf("%d\n", ans); } } return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'void combine(int, int)':
bitaro.cpp:38:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |  for (int i = 0; i < edg.size(); i++) {
      |                  ~~^~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:59:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |  scanf("%d%d%d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |   scanf("%d%d", &u, &v);
      |   ~~~~~^~~~~~~~~~~~~~~~
bitaro.cpp:81:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |   scanf("%d%d", &st, &qSz);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:84:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |    scanf("%d", &qId[i]);
      |    ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...