제출 #312235

#제출 시각아이디문제언어결과실행 시간메모리
312235daveeedRailway (BOI17_railway)C++17
100 / 100
242 ms40556 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; const int MAXN = 1e5 + 5; const int MAXD = 18; int N, M, K, LCA[MAXN][MAXD], depth[MAXN]; vector<pair<int, int> > adj[MAXN]; vector<int> add[MAXN], sub[MAXN], ans; void dfs(int i, int p){ for(auto it: adj[i]) if(it.first != p){ depth[it.first] = depth[i] + 1; LCA[it.first][0] = i; dfs(it.first, i); } } set<int> dfs2(int i, int p, int from){ set<int> curr; for(auto it: adj[i]) if(it.first != p){ set<int> temp = dfs2(it.first, i, it.second); if(temp.size() > curr.size()) swap(temp, curr); curr.insert(temp.begin(), temp.end()); } for(int x: add[i]){ curr.insert(x); } for(int x: sub[i]){ curr.erase(x); } if((int)curr.size() >= K){ if(from != 0) ans.push_back(from); } return curr; } void initLCA(){ for(int d = 1; d < MAXD; d++){ for(int i = 1; i <= N; i++){ LCA[i][d] = LCA[LCA[i][d - 1]][d - 1]; } } } int getLCA(int a, int b){ if(depth[a] < depth[b]) swap(a, b); for(int d = MAXD - 1; d >= 0; d--){ if(depth[a] - (1 << d) >= depth[b]){ a = LCA[a][d]; } } for(int d = MAXD - 1; d >= 0; d--){ if(LCA[a][d] != LCA[b][d]){ a = LCA[a][d]; b = LCA[b][d]; } } if(a != b) a = LCA[a][0]; return a; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M >> K; for(int i = 1; i < N; i++){ int a, b; cin >> a >> b; adj[b].push_back(make_pair(a, i)); adj[a].push_back(make_pair(b, i)); } dfs(1, 0); initLCA(); for(int i = 0; i < M; i++){ int s; cin >> s; vector<int> nums(s); int lca = -1; for(int i = 0; i < s; i++){ cin >> nums[i]; if(lca == -1){ lca = nums[i]; } else{ lca = getLCA(lca, nums[i]); } } for(int x: nums){ add[x].push_back(i); } sub[lca].push_back(i); } dfs2(1, 0, 0); sort(ans.begin(), ans.end()); cout << ans.size() << "\n"; for(int x: ans){ cout << x << " "; } }
#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...