제출 #747437

#제출 시각아이디문제언어결과실행 시간메모리
747437vjudge1Railway (BOI17_railway)C++17
0 / 100
291 ms524288 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 100001; const int K = 20; int n, m, k, x; vector<pair<int, int>> g[MAXN]; int cnt[MAXN], up[MAXN][K], d[MAXN]; void dfs(int u, int p = 0) { up[u][0] = p; for (int i = 1; i < K; i++) { up[u][i] = up[up[u][i-1]][i-1]; } for (auto [v, idx] : g[u]) { if (v != p) { d[v] = d[u] + 1; dfs(v, u); } } } int lca(int a, int b) { int i=19; if(d[a]>d[b])swap(a, b); while(i>=0 && d[a] < d[b]){ if(d[up[a][i]]>d[b])a=up[a][i]; i--; } a=up[a][0]; for(i=19;i>0;i--){ if(up[a][i]!=up[b][i]){ a=up[a][i]; b=up[b][i]; } } return up[a][0]; } vector<int> ans; int dfs2(int x, int p, int id){ for(auto i : g[x]){ if(x!=p); cnt[x]+=dfs2(i.first, x, i.second); } if(cnt[x]>=k && id)ans.push_back(id); return cnt[x]; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k; for (int i = 1; i <= n - 1; i++) { int a, b; cin >> a >> b; g[a].push_back({b,i}); g[b].push_back({a,i}); } dfs(1); for (int i = 1; i <= m; i++) { cin >> x; assert(x == 2); int a, b; cin >> a >> b; int u = lca(a, b); cnt[u] -= 2; cnt[a]++; cnt[b]++; } dfs2(1, 0, 0); cout<<ans.size()<<'\n'; for(int i:ans)cout<<i<<' '; cout<<endl; 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...