Submission #1159226

#TimeUsernameProblemLanguageResultExecution timeMemory
1159226mendekeSpring cleaning (CEOI20_cleaning)C++20
9 / 100
1096 ms19708 KiB
//#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> #define ll long long #define F first #define S second #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define all(x) x.begin(), x.end() const int mod = 1e9 + 7; const int N = 100001; using namespace std; ll n, q, m, a, b, c, d[N], cntleaves, p[N], used[N], cnt[N], ans, us[N]; vector <ll> g[N], dr, gl[N]; deque <pair <ll, ll>> sol; deque <ll> st; void dfs (ll v, ll pr){ for (auto i: g[v]){ if (i != pr){ d[i] = d[v] + 1; dfs (i, v); } } } void ch (ll v, ll pr){ for (auto i: g[v]){ if (i != pr){ ch (i, v); d[v] = max (d[v], d[i]); } } } void LT (ll v, ll pr, ll dep){ d[v] = dep; if (g[v].size() == 1){ st.pb (dep); } for (auto i: g[v]){ if (i != pr){ LT (i, v, dep + 1); } } } signed main (){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; for (int i = 1; i < n; i++){ cin >> a >> b; g[a].pb (b); g[b].pb (a); } for (int i = 1; i <= n; i++){ if (g[i].size() == 1){ cntleaves++; } } d[1] = 1; dfs (1, 1); a = b = 0; for (int i = 1; i <= n; i++){ if (a < d[i]){ a = d[i]; b = i; } } d[b] = 1; dfs (b, b); ch (b, b); st.pb (b); used[b] = 1; while (st.size()){ a = st[0]; dr.pb (a); st.ppf(); for (auto i: g[a]){ if (used[i] == 0 && d[i] == d[a]){ st.pb (i); used[i] = 1; break; } } } for (auto i: dr){ d[i] = 0; for (auto j: g[i]){ st.clear(); if (used[j] == 0){ LT (j, i, 1); for (auto y: st){ gl[i].pb (y); } } } } for (int z = 1; z <= q; z++){ cin >> m; a = 0; b = 0; for (int j = 1; j <= m; j++){ cin >> p[j]; if (g[p[j]].size() == 1){ if (us[p[j]] == 0){ us[p[j]] = 1; b++; } else{ gl[p[j]].pb (d[p[j]] + 1); cnt[p[j]]++; b--; } } else{ gl[p[j]].pb (1); cnt[p[j]]++; a++; } } for (int i = 1; i <= m; i++){ us[p[i]] = 0; } if ((cntleaves + a) % 2){ for (int i = 0; i < dr.size(); i++){ while (cnt[i] > 0){ cnt[i]--; gl[i].ppb(); } } cout << "-1\n"; continue; } ans = 0; ans += dr.size() - 1; sol.clear(); for (int i = 0; i < dr.size(); i++){ for (auto j: gl[dr[i]]){ if (sol.size()){ ans += sol[0].F + j + (i - sol[0].S); sol.ppf(); } else{ sol.pb ({j, i}); } } } for (int i = 0; i < dr.size(); i++){ while (cnt[i] > 0){ cnt[i]--; gl[i].ppb(); } } cout << ans + b << '\n'; } }
#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...