Submission #578138

#TimeUsernameProblemLanguageResultExecution timeMemory
578138talant117408Spring cleaning (CEOI20_cleaning)C++17
35 / 100
373 ms24760 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; #define long unsigned long #define pb push_back #define mp make_pair #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define lb lower_bound #define ub upper_bound #define sz(v) int((v).size()) #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl '\n' const int N = 2e5+7; vector <vector <int>> graph(N), new_graph(N); int root, subtree[N], depth[N], parent[N], nw[N]; ll ans; void dfs(int v, int p) { subtree[v] = (sz(new_graph[v]) == 1 ? 1 : 0); parent[v] = p; for (auto to : new_graph[v]) { if (to == p) { continue; } depth[to] = depth[v] + 1; dfs(to, v); subtree[v] += subtree[to]; } ans += 2 - (subtree[v] % 2); } int get(int n) { ans = 0; for (int i = 1; i <= n; i++) { if (sz(new_graph[i]) > 1) { root = i; } } dfs(root, root); if (subtree[root]&1) return -1; else return ans-2; } void subtask5(int n, int q) { for (int i = 1; i <= n; i++) { new_graph[i].clear(); for (auto to : graph[i]) new_graph[i].pb(to); } dfs(1, 1); auto res = ans-2; int l = int(log2(n))+1; if (n != (1 << l) - 1) return; int mn = 2e9, mx = -2e9; for (int i = 1; i <= n; i++) { if (sz(graph[i]) == 1) { mn = min(mn, depth[i]); mx = max(mx, depth[i]); } } if (mx != mn) return; while (q--) { int k; cin >> k; res += k; vector <int> D(k); for (auto &to : D) cin >> to; for (auto to : D) { auto x = to; if (sz(graph[x]) == 1) { nw[x]++; } if (sz(graph[x]) == 1 && nw[x] == 1) continue; while (x != parent[x]) { subtree[x]++; if (subtree[x]&1) res--; else res++; x = parent[x]; } subtree[1]++; } if (subtree[1]&1) cout << -1 << endl; else cout << res << endl; for (auto to : D) { auto x = to; if (sz(graph[x]) == 1) { nw[x]--; } if (sz(graph[x]) == 1 && nw[x] == 0) continue; while (x != parent[x]) { if (subtree[x]&1) res++; else res--; subtree[x]--; x = parent[x]; } subtree[1]--; } res -= k; } exit(0); } void solve() { int n, q; cin >> n >> q; for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; graph[a].pb(b); graph[b].pb(a); } subtask5(n, q); if (n <= 20000 && q <= 300) { while (q--) { int vertex = n+1; int k; cin >> k; for (int i = 1; i <= n+k; i++) { new_graph[i].clear(); for (auto to : graph[i]) new_graph[i].pb(to); } while (k--) { int x; cin >> x; new_graph[x].pb(vertex); new_graph[vertex].pb(x); vertex++; } cout << get(vertex-1) << endl; } } else { for (int i = 1; i <= n; i++) { new_graph[i].clear(); for (auto to : graph[i]) new_graph[i].pb(to); } dfs(1, 1); ans -= 2; if (sz(graph[1]) > 1) { while (q--) { int k; cin >> k; ans += k; while (k--) { int x; cin >> x; } if (subtree[1]&1) { if (k&1) cout << ans << endl; else cout << -1 << endl; } else if (k&1) cout << -1 << endl; else cout << ans << endl; ans -= k; } } else { while (q--) { int k; cin >> k; while (k--) { int x; cin >> x; } k--; ans += k; if (subtree[1]&1) { if (k&1) cout << ans << endl; else cout << -1 << endl; } else if (k&1) cout << -1 << endl; else cout << ans << endl; ans -= k; } } } } int main() { do_not_disturb int t = 1; //~ cin >> t; while (t--) { solve(); } return 0; } /* 7 5 1 2 1 3 2 4 2 5 3 6 3 7 1 1 2 1 1 2 7 7 2 6 7 2 4 7 */
#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...