Submission #404774

#TimeUsernameProblemLanguageResultExecution timeMemory
404774rama_pangRailway (BOI17_railway)C++17
100 / 100
242 ms36272 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int N, M, K; cin >> N >> M >> K; vector<vector<int>> adj(N); map<pair<int, int>, int> edge_id; for (int i = 1; i < N; i++) { int u, v; cin >> u >> v; u--, v--; edge_id[{u, v}] = i; edge_id[{v, u}] = i; adj[u].emplace_back(v); adj[v].emplace_back(u); } vector<int> st(N); vector<int> siz(N); vector<int> par(N); vector<int> root(N); vector<int> depth(N); const auto DfsInit = [&](const auto &self, int u, int p) -> void { if (p != -1) { adj[u].erase(find(begin(adj[u]), end(adj[u]), p)); } par[u] = p; siz[u] = 1; for (auto &v : adj[u]) { depth[v] = depth[u] + 1; self(self, v, u); siz[u] += siz[v]; if (siz[v] > siz[adj[u][0]]) { swap(v, adj[u][0]); } } }; const auto DfsHld = [&](const auto &self, int u) -> void { static int timer = 0; st[u] = timer++; for (auto v : adj[u]) { root[v] = v == adj[u][0] ? root[u] : v; self(self, v); } }; DfsInit(DfsInit, 0, -1); DfsHld(DfsHld, 0); const auto Lca = [&](int x, int y) { while (root[x] != root[y]) { if (depth[root[x]] > depth[root[y]]) swap(x, y); y = par[root[y]]; } if (depth[x] > depth[y]) swap(x, y); return x; }; vector<int> cnt(N); vector<int> answer; const auto DfsCnt = [&](const auto &self, int u) -> void { for (auto v : adj[u]) { self(self, v); if (cnt[v] >= K) { answer.emplace_back(edge_id[{u, v}]); } cnt[u] += cnt[v]; } }; while (M--) { int s; cin >> s; vector<int> ls; for (int i = 0; i < s; i++) { int u; cin >> u; ls.emplace_back(--u); } sort(begin(ls), end(ls), [&](int i, int j) { return st[i] < st[j]; }); for (int i = 0; i < s; i++) { int u = ls[(i + 0) % s]; int v = ls[(i + 1) % s]; cnt[v]++; cnt[Lca(u, v)]--; } } DfsCnt(DfsCnt, 0); cout << answer.size() << '\n'; sort(begin(answer), end(answer)); for (int i = 0; i < int(answer.size()); i++) { cout << answer[i] << " \n"[i + 1 == answer.size()]; } return 0; }

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:103:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |     cout << answer[i] << " \n"[i + 1 == answer.size()];
      |                                ~~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...