제출 #1091895

#제출 시각아이디문제언어결과실행 시간메모리
10918954QT0RRailway (BOI17_railway)C++17
100 / 100
95 ms35136 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long vector<pair<ll,ll>> graph[100003]; ll preorder[100003]; ll postorder[100003]; ll iter=0; ll jmp[100003][19]; ll dep[100003]; ll sum[100003]; void dfs(ll v, ll p){ preorder[v]=iter++; jmp[v][0]=p; for (ll i = 1; i<19; i++)jmp[v][i]=jmp[jmp[v][i-1]][i-1]; for (auto [u,ind] : graph[v]){ if (u==p)continue; dep[u]=dep[v]+1; dfs(u,v); } postorder[v]=iter++; } ll lca(ll a, ll b){ if (dep[a]<dep[b])swap(a,b); for (ll i = 18; i>=0; i--)if (dep[jmp[a][i]]>=dep[b])a=jmp[a][i]; if (a==b)return a; for (ll i = 18; i>=0; i--)if (jmp[a][i]!=jmp[b][i]){ a=jmp[a][i]; b=jmp[b][i]; } return jmp[a][0]; } vector<ll> ans; void dfs2(ll v, ll p){ for (auto [u,ind] : graph[v]){ if (u==p)continue; dfs2(u,v); sum[v]+=sum[u]; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll n,m,k; cin >> n >> m >> k; for (ll i = 1,v,u; i<n; i++){ cin >> v >> u; graph[v].push_back({u,i}); graph[u].push_back({v,i}); } dfs(1,1); for (ll i = 1,s; i<=m; i++){ cin >> s; vector<ll> vec(s); for (ll j = 0; j<s; j++)cin >> vec[j]; sort(vec.begin(),vec.end(),[](ll a, ll b){return preorder[a]<preorder[b];}); vec.push_back(vec[0]); for (ll j = 0; j<s; j++){ sum[vec[j]]++; sum[vec[j+1]]++; sum[lca(vec[j],vec[j+1])]-=2; } } dfs2(1,0); for (ll v = 1; v<=n; v++){ for (auto [u,ind] : graph[v]){ if (preorder[u]<preorder[v] && postorder[u]>postorder[v] && sum[v]>=2*k){ ans.push_back(ind); } } } sort(ans.begin(),ans.end()); cout << ans.size() << '\n'; for (auto u : ans)cout << u << ' '; 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...