Submission #756827

#TimeUsernameProblemLanguageResultExecution timeMemory
756827NeroZeinRailway (BOI17_railway)C++17
100 / 100
108 ms33376 KiB
#include "bits/stdc++.h" using namespace std; #ifdef Nero #include "Deb.h" #else #define deb(...) #endif template<typename T, class F = function<T(const T&, const T&)>> struct SparseTable { int n; F func; vector<vector<T>> mat; SparseTable () {} SparseTable (const vector<T>& a, F f) : func(f) { n = (int) a.size(); int max_log = 32 - __builtin_clz(n); mat.resize(max_log); mat[0] = a; for (int j = 1; j < max_log; ++j) { mat[j].resize(n - (1 << j) + 1); for (int i = 0; i <= n - (1 << j); ++i) { mat[j][i] = func(mat[j - 1][i], mat[j - 1][i + (1 << (j - 1))]); } } } T get (int from, int to) { assert(0 <= from && from <= to && to <= n - 1); int lg = 31 - __builtin_clz(to - from + 1); return func(mat[lg][from], mat[lg][to - (1 << lg) + 1]); } }; const int N = 100005; vector<pair<int, int>> g[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; cin >> n >> m >> k; for(int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; g[u].emplace_back(v, i); g[v].emplace_back(u, i); } int idd = 0; vector<int> f(n + 1); vector<int> dep(n + 1); vector<int> o(2 * n - 1); function<void(int, int)> Dfs = [&](int v, int p) { f[v] = idd; o[idd++] = v; for (auto [u, i] : g[v]) { if (u == p) { continue; } dep[u] = dep[v] + 1; Dfs(u, v); o[idd++] = v; } }; Dfs(1, 1); SparseTable<int> spa(o, [&](int x, int y) { return dep[x] < dep[y] ? x : y; }); auto Lca = [&](int u, int v) { u = f[u], v = f[v]; if (u > v) swap(u, v); return spa.get(u, v); }; vector<int> dp(n + 1); auto Add = [&](int u, int v) { dp[u]++; dp[v]++; dp[Lca(u, v)] -= 2; }; for (int i = 0; i < m; ++i) { int s; cin >> s; vector<int> a(s); for (int j = 0; j < s; ++j) { cin >> a[j]; } sort(a.begin(), a.end(), [&](int x, int y) { return f[x] < f[y]; }); for (int j = 1; j <= s; ++j) { Add(a[j - 1], a[j % s]); } } vector<int> ans; function<int(int, int)> Dfs2 = [&](int v, int p) { int ret = dp[v]; for (auto [u, i] : g[v]) { if (u == p) { continue; } int c = Dfs2(u, v); ret += c; if (c / 2 >= k) { ans.push_back(i + 1); } } return ret; }; Dfs2(1, 1); sort(ans.begin(), ans.end()); cout << ans.size() << '\n'; for (int i = 0; i < (int) ans.size(); ++i) { cout << ans[i] << " \n"[i == (int) ans.size() - 1]; } return 0; }
#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...