제출 #479696

#제출 시각아이디문제언어결과실행 시간메모리
479696MilosMilutinovicBitaro’s Party (JOI18_bitaro)C++14
0 / 100
2082 ms7440 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int M = 5; 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 x = all[u].size() - 1, y = all[v].size() - 1; vector<pair<int, int>> edg; while (x >= 0 || y >= 0) { if (edg.size() > M) break; if (x >= 0 && taken[all[u][x].second]) { x--; continue; } if (y >= 0 && taken[all[v][y].second]) { y--; continue; } if (x < 0 || (y >= 0 && all[u][x].first <= all[v][y].first + 1)) { edg.push_back({all[v][y].first + 1, all[v][y].second}); taken[all[v][y].second] = true; y--; } else { edg.push_back({all[u][x].first, all[u][x].second}); taken[all[u][x].second] = true; x--; } } for (int i = 0; i < edg.size(); i++) { taken[edg[i].second] = false; } 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) { 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; }

컴파일 시 표준 에러 (stderr) 메시지

bitaro.cpp: In function 'void combine(int, int)':
bitaro.cpp:37: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]
   37 |  for (int i = 0; i < edg.size(); i++) {
      |                  ~~^~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:55:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |  scanf("%d%d%d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:58:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |   scanf("%d%d", &u, &v);
      |   ~~~~~^~~~~~~~~~~~~~~~
bitaro.cpp:77:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |   scanf("%d%d", &st, &qSz);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:80:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |    scanf("%d", &qId[i]);
      |    ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...