Submission #951141

#TimeUsernameProblemLanguageResultExecution timeMemory
951141inkvizytorRailway (BOI17_railway)C++14
100 / 100
173 ms38352 KiB
#include <bits/stdc++.h> #define fi first #define se second using namespace std; int k; int logarytm(int a) { int w = 0; while (a > 0) { w++; a /= 2; } return w+1; } int l; vector<vector<pair<int, int>>> g; vector<int> o; vector<int> d; vector<bool> odw; vector<vector<int>> p; vector<vector<int>> w; vector<vector<int>> sp; vector<vector<int>> jp; void dfs (int v) { odw[v] = 1; for (int x : w[v]) { sp[x].push_back(v); } for (auto u : g[v]) { if (!odw[u.fi]) { o[u.fi] = v; d[u.fi] = d[v]+1; dfs(u.fi); } } } int lca (int a, int b) { int w; w = l-1; while (d[a] > d[b]) { if (d[jp[a][w]] >= d[b]) { a = jp[a][w]; } w--; } w = l-1; while (d[b] > d[a]) { if (d[jp[b][w]] >= d[a]) { b = jp[b][w]; } w--; } w = l-1; while (w >= 0) { if (jp[a][w] != jp[b][w]) { a = jp[a][w]; b = jp[b][w]; } w--; } if (a != b) { return o[a]; } return a; } vector<bool> odw2; vector<int> z; vector<int> kr; void dfs2 (int v, int ko) { odw2[v] = 1; for (auto u : g[v]) { if (!odw2[u.first]) { dfs2(u.first, u.second); z[v] += z[u.first]; } } if (z[v] >= 2*k) { kr.push_back(ko); } } int main() { //ios_base::sync_with_stdio(0); //cin.tie(0); int n, m; cin >> n >> m >> k; g.resize(n+1); vector<pair<int, int>> s (n, make_pair(0, 0)); for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; g[a].push_back(make_pair(b, i)); g[b].push_back(make_pair(a, i)); s[i] = make_pair(a, b); } p.resize(m); w.resize(n+1); sp.resize(m); for (int i = 0; i < m; i++) { int s; cin >> s; p[i].resize(s); for (int j = 0; j < s; j++) { cin >> p[i][j]; w[p[i][j]].push_back(i); } } o.resize(n+1, 0); d.resize(n+1, 0); odw.resize(n+1, 0); o[1] = 1; d[1] = 0; dfs(1); l = logarytm(n); jp.resize(n+1, vector<int>(l, 0)); for (int i = 1; i < n+1; i++) { jp[i][0] = o[i]; } for (int i = 1; i < l; i++) { for (int j = 1; j < n+1; j++) { jp[j][i] = jp[jp[j][i-1]][i-1]; } } z.resize(n+1, 0); for (auto x : sp) { for (int i = 0; i < x.size()-1; i++) { z[x[i]]++; z[x[i+1]]++; z[lca(x[i], x[i+1])] -= 2; } z[x[0]]++; z[x[x.size()-1]]++; z[lca(x[0], x[x.size()-1])] -= 2; } odw2.resize(n+1, 0); dfs2(1, 0); cout << kr.size() << '\n'; sort(kr.begin(), kr.end()); for (int x : kr) { cout << x << ' '; } }

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:132:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |         for (int i = 0; i < x.size()-1; i++) {
      |                         ~~^~~~~~~~~~~~
#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...