Submission #585876

#TimeUsernameProblemLanguageResultExecution timeMemory
585876MohamedFaresNebiliSpring cleaning (CEOI20_cleaning)C++14
28 / 100
634 ms18948 KiB
#include <bits/stdc++.h> /// #pragma GCC optimize ("Ofast") /// #pragma GCC target ("avx2") /// #pragma GCC optimize("unroll-loops") using namespace std; using ll = long long; using ii = pair<int, int>; using vi = vector<int>; #define ff first #define ss second #define pb push_back #define all(x) (x).begin(), (x).end() #define lb lower_bound const int MOD = 1000 * 1000 * 1000 + 7; int N, Q, R, L, T, timer; int s[100001], par[100001]; int tin[100001], head[100001], heavy[100001]; int st[400004], lazy[400004]; int vis[100001]; vector<int> adj[100001]; void prop(int v, int l, int r) { if(l == r || !lazy[v]) return; int md = (l + r) / 2; int A = md - l + 1, B = r - md; st[v * 2] = A - st[v * 2]; st[v * 2 + 1] = B - st[v * 2 + 1]; lazy[v * 2] ^= 1, lazy[v * 2 + 1] ^= 1; lazy[v] = 0; } void update(int v, int l, int r, int lo, int hi) { prop(v, l, r); if(l > hi || r < lo) return; if(l >= lo && r <= hi) { lazy[v] ^= 1; st[v] = r - l + 1 - st[v]; prop(v, l, r); return; } int md = (l + r) / 2; update(v * 2, l, md, lo, hi); update(v * 2 + 1, md + 1, r, lo, hi); st[v] = st[v * 2] + st[v * 2 + 1]; } void dfs(int v, int p) { s[v] = 1; par[v] = p; heavy[v] = 0; if(p != 0) adj[v].erase(find(adj[v].begin(), adj[v].end(), p)); for(auto u : adj[v]) { dfs(u, v); s[v] += s[u]; if(s[u] > s[heavy[v]]) heavy[v] = u; } } void HLD(int v, int p, int t) { tin[v] = timer++; head[v] = t; if(heavy[v] == 0) return; HLD(heavy[v], v, t); for(auto u : adj[v]) { if(u == heavy[v]) continue; HLD(u, v, u); } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> Q; for(int l = 0; l < N - 1; l++) { int U, V; cin >> U >> V; adj[U].pb(V), adj[V].pb(U); } R = 1; for(int l = 1; l <= N; l++) if(adj[l].size() > 1) { R = l; break; } dfs(R, 0); HLD(R, 0, R); for(int l = 1; l <= N; l++) { if(adj[l].size() > 1) continue; ++L; for(int u = l; u; u = par[head[u]]) update(1, 0, N - 1, tin[head[u]], tin[u]); } while(Q--) { T++; int D; cin >> D; int A[D]; vector<int> rev; int C = D + L; for(int l = 0; l < D; l++) { int V; cin >> V; A[l] = V; if(adj[V].size() <= 1 && vis[V] != T) { vis[V] = T, rev.pb(V); --C; } } if(C & 1) { cout << -1 << endl; continue; } for(auto u : rev) for(; u; u = par[head[u]]) update(1, 0, N - 1, tin[head[u]], tin[u]); for(int l = 0; l < D; l++) for(int u = A[l]; u; u = par[head[u]]) update(1, 0, N - 1, tin[head[u]], tin[u]); int odd = st[1] + D; int even = N - 1 - st[1]; cout << odd + 2 * even << endl; for(auto u : rev) for(; u; u = par[head[u]]) update(1, 0, N - 1, tin[head[u]], tin[u]); for(int l = 0; l < D; l++) for(int u = A[l]; u; u = par[head[u]]) update(1, 0, N - 1, tin[head[u]], tin[u]); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...