제출 #1270216

#제출 시각아이디문제언어결과실행 시간메모리
1270216thanhcodedaoSpring cleaning (CEOI20_cleaning)C++20
9 / 100
1097 ms31560 KiB
#include <bits/stdc++.h> #define N 100000 #define pb push_back #define fu(i, a, b) for (int i = a; i <= b; i++) #define fd(i, a, b) for (int i = a; i >= b; i--) #define F first #define S second #define ii pair<int, int> #define M 1000000007 #define int long long #define el '\n' #define bit(mark, i) ((mark >> i) & 1) using namespace std; int n, q, up[N + 5][20], h[N + 5]; vector <int> g[N + 5]; vector <int> d, e; void dfs(int u, int p){ int t = 0; for (auto v : g[u]) if (v != p){ t++; dfs(v, u); } if (t == 0) d.pb(u); } void sub1(){ int ans = 1; bool ok = true; if (d.size() % 2 == 1){ ok = false; } else{ int cap = d.size() / 2; ans += (cap - 1) * 2; } //cout << ans << el; while (q--){ int m; cin >> m; fu(i, 1, m){ int x; cin >> x; } if (!ok) cout << -1 << el; else{ cout << ans + m << el; } } } void dfs1(int u, int p){ for (auto v : g[u]) if (v != p){ h[v] = h[u] + 1; up[v][0] = u; dfs1(v, u); } } int lca(int u, int v){ if (h[u] < h[v]) swap(u, v); int k = h[u] - h[v]; fd(i, 19, 0){ if (bit(k, i)){ u = up[u][i]; } } if (u == v) return u; fd(i, 19, 0){ if (up[u][i] != up[v][i]){ u = up[u][i]; v = up[v][i]; } } return up[u][0]; } int dist(int u, int v, int l){ return h[u] + h[v] - 2 * h[l]; } map <int, int> mp; bool cmp(int x, int y){ return h[x] + mp[x] < h[y] + mp[y]; } int dem[N + 5]; void sub2(){ sort(d.begin(), d.end()); fu(i, 1, q){ int m; cin >> m; vector <int> a = d; vector <int> c(m); int cnt = 0; fu(i, 1, m){ int x; cin >> x; auto it = lower_bound(d.begin(), d.end(), x); if (it == d.end() || *it != x || dem[x]) a.pb(x), mp[x] = 1; else{ int pos = it - d.begin(); a[pos] = x; dem[x]++; } cnt++; } sort(a.begin(), a.end(), cmp); // for (auto x : a) cout << x << ' '; // cout << el; int ans = 0; if (a.size() % 2 == 1){ cout << -1 << el; continue; } int len = a.size(); int l = lca(a[0], a[len - 1]); ans += dist(a[0], a[len - 1], l); // cout << a[0] << ' ' << a[len - 1] << ' ' << l << ' ' << dist(a[0], a[len - 1], l) << el; for (int i = 1; i < len - 1; i += 2){ int u = a[i], v = a[i + 1]; int l = lca(u, v); int s = dist(u, v, l); ans += s; // cout << u << ' ' << v << ' ' << l << ' ' << s<< el; } mp.clear(); memset(dem, 0, sizeof(dem)); // cout << ans << el; cout << ans + cnt << el; } } signed main(){ // freopen("crt.inp", "r", stdin); // freopen("crt.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; vector <int> t; fu(i, 2, n){ int u, v; cin >> u >> v; if (u > v) swap(u, v); g[u].pb(v); g[v].pb(u); if (u == 1) t.pb(v); } d.pb(1); dfs(1, 0); e = d; sort(e.begin(), e.end()); // for (auto x : d) cout << x << ' '; // cout << el; if (t.size() == n - 1){ sub1(); } dfs1(1, 0); fu(i, 1, 19){ fu(j, 1, n){ up[j][i] = up[up[j][i - 1]][i - 1]; } } sub2(); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...