Submission #762844

#TimeUsernameProblemLanguageResultExecution timeMemory
762844ThegeekKnight16Railway (BOI17_railway)C++17
100 / 100
86 ms26428 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 10; const int MAXK = 21; array<int, MAXN> prof, paiEdge, tin, Marc; array<array<int, MAXK>, MAXN> dp; array<vector<pair<int, int>>, MAXN> grafo; vector<int> resp; int N, M, K; int temp = 0; void dfs(int v, int p, int edge) { tin[v] = ++temp; prof[v] = prof[p]+1; paiEdge[v] = edge; dp[v][0] = p; for (int k = 1; k < MAXK; k++) dp[v][k] = dp[dp[v][k-1]][k-1]; for (auto [viz, e] : grafo[v]) { if (viz == p) continue; dfs(viz, v, e); } } int lca(int a, int b) { if (prof[a] < prof[b]) swap(a, b); int jump = prof[a] - prof[b]; for (int k = 0; k < MAXK; k++) if (jump & (1 << k)) a = dp[a][k]; if (a == b) return a; for (int k = MAXK-1; k >= 0; k--) if (dp[a][k] != dp[b][k]) a = dp[a][k], b = dp[b][k]; return dp[a][0]; } void calcResp(int v, int p) { // cerr << v << " " << Marc[v] << " " << paiEdge[v] << '\n'; for (auto [viz, e] : grafo[v]) { if (viz == p) continue; calcResp(viz, v); Marc[v] += Marc[viz]; } // cerr << v << " " << Marc[v] << " " << paiEdge[v] << '\n'; if (Marc[v] >= 2*K && paiEdge[v] > 0) resp.push_back(paiEdge[v]); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N >> M >> K; for (int i = 1; i < N; i++) { int X, Y; cin >> X >> Y; grafo[X].emplace_back(Y, i); grafo[Y].emplace_back(X, i); } dfs(1, 1, 0); for (int i = 1; i <= M; i++) { int S; cin >> S; vector<int> verts(S); for (auto &x : verts) cin >> x; sort(verts.begin(), verts.end(), [&](const int &a, const int &b) {return tin[a] < tin[b];}); verts.push_back(verts[0]); for (int i = 0; i < S; i++) { // cerr << verts[i] << " " << verts[i+1] << " " << lca(verts[i], verts[i+1]) << '\n'; Marc[verts[i]]++; Marc[verts[i+1]]++; Marc[lca(verts[i], verts[i+1])] -= 2; } } calcResp(1, 1); sort(resp.begin(), resp.end()); cout << resp.size() << '\n'; for (auto x : resp) cout << x << " "; cout << '\n'; }
#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...