Submission #1288929

#TimeUsernameProblemLanguageResultExecution timeMemory
1288929loomSpring cleaning (CEOI20_cleaning)C++20
0 / 100
1096 ms327680 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf (int)2e18 #define nl '\n' const int N = 1e5+1; vector<int> g[N], gvt[N]; int dp[N], odd[N], eve[N], dep[N], up[N][18], tin[N], sz[N]; int ans, fans, cnt; void dfs(int v, int p){ tin[v] = cnt++; if(g[v].size() == 1) dp[v] = 1; for(int ch : g[v]){ if(ch == p) continue; dep[ch] = dep[v] + 1; up[ch][0] = v; dfs(ch, v); dp[v] += dp[ch]; if(dp[ch] % 2 == 0) ans++; } } void dfs2(int v, int p){ odd[v] = odd[p]; eve[v] = eve[p]; (dp[v] % 2 ? odd[v] : eve[v])++; for(int ch : g[v]){ if(ch != p) dfs2(ch, v); } } void dfs3(int v){ for(int ch : gvt[v]){ dfs3(ch); sz[v] += sz[ch]; if(sz[ch] % 2) fans += odd[ch] - odd[v] - (eve[ch] - eve[v]); } } int lca(int x, int y){ if(dep[x] > dep[y]) swap(x, y); int k = dep[y] - dep[x]; for(int i = 0; i < 18; i++) if(k & 1<<i) y = up[y][i]; if(x == y) return x; for(int i = 17; i >= 0; i--){ if(up[x][i] == up[y][i]) continue; x = up[x][i]; y = up[y][i]; } return up[x][0]; } bool cmp(int x, int y){ return tin[x] < tin[y]; } void solve(){ int n, q; cin>>n>>q; for(int i = 1; i < n; i++){ int x, y; cin>>x>>y; g[x].push_back(y); g[y].push_back(x); } int r, tot = 0; for(int i = 1; i <= n; i++){ if(g[i].size() > 1) r = i; else tot++; } r = 2; up[r][0] = r; dfs(r, 0); dfs2(r, 0); for(int j = 1; j < 18; j++){ for(int i = 1; i <= n; i++){ up[i][j] = up[up[i][j-1]][j-1]; } } while(q--){ int m; cin>>m; vector<int> v(m); for(int &x : v) cin>>x; auto l = v; sort(v.begin(), v.end(), cmp); for(int i = 1; i < m; i++){ v.push_back(lca(v[i-1], v[i])); } sort(v.begin(), v.end(), cmp); v.erase(unique(v.begin(), v.end()), v.end()); for(int x : v){ sz[x] = (g[x].size() == 1 ? -1 : 0); gvt[x].clear(); } for(int x : l) sz[x]++; for(int i = 1; i < m; i++){ gvt[lca(v[i-1], v[i])].push_back(v[i]); } fans = ans + n + m - 1; r = v[0]; dfs3(r); cout<<((tot + sz[r]) % 2 == 0 ? fans : -1)<<nl; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); 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...