제출 #1251209

#제출 시각아이디문제언어결과실행 시간메모리
1251209kaiboyRailway (BOI17_railway)C++20
100 / 100
114 ms15884 KiB
#include <algorithm> #include <iostream> #include <vector> using namespace std; const int N = 100000; int ij[N - 1]; vector<int> eh[N]; int ta[N], tb[N]; int dd[N], pp[N], qq[N]; int ii[N], ft[N], kk[N]; void dfs(int p, int i, int d) { static int t; ta[i] = t++; dd[i] = d++; pp[i] = qq[i] = p; if (dd[p] - dd[qq[p]] == dd[qq[p]] - dd[qq[qq[p]]]) qq[i] = qq[qq[p]]; for (int h : eh[i]) { int j = i ^ ij[h]; if (j != p) dfs(i, j, d); } tb[i] = t; } void update(int i, int n, int a) { for ( ; i < n; i |= i + 1) ft[i] += a; } int query(int i) { int a = 0; for ( ; i >= 0; i &= i + 1, i--) a += ft[i]; return a; } int lca(int i, int j) { if (dd[i] < dd[j]) swap(i, j); while (dd[i] > dd[j]) if (dd[qq[i]] > dd[j]) i = qq[i]; else i = pp[i]; while (i != j) if (qq[i] != qq[j]) i = qq[i], j = qq[j]; else i = pp[i], j = pp[j]; return i; } bool check(int i) { return query(tb[i] - 1) - query(ta[i] - 1); } int search(int i) { while (!check(i)) if (!check(qq[i])) i = qq[i]; else i = pp[i]; return i; } int dfs_(int h_, int i, int k_) { int k = kk[i]; for (int h : eh[i]) if (h != h_) k += dfs_(h, i ^ ij[h], k_); if (i && k >= k_) ij[h_] = -1; return k; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n, q, k; cin >> n >> q >> k; for (int h = 0; h < n - 1; h++) { int i, j; cin >> i >> j, i--, j--; ij[h] = i ^ j; eh[i].push_back(h); eh[j].push_back(h); } dfs(0, 0, 0); while (q--) { int m; cin >> m; for (int h = 0; h < m; h++) cin >> ii[h], ii[h]--; int a = ii[0]; update(ta[a], n, 1); for (int h = 1; h < m; h++) { int i = ii[h]; kk[a]++, kk[a = lca(a, i)]--; kk[i]++, kk[search(i)]--; update(ta[i], n, 1); } for (int h = 0; h < m; h++) update(ta[ii[h]], n, -1); } dfs_(-1, 0, k); int x = 0; for (int h = 0; h < n - 1; h++) if (ij[h] == -1) x++; cout << x << '\n'; for (int h = 0; h < n - 1; h++) if (ij[h] == -1) cout << h + 1 << ' '; cout << '\n'; 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...