제출 #1159341

#제출 시각아이디문제언어결과실행 시간메모리
1159341Kaztaev_AlisherSpring cleaning (CEOI20_cleaning)C++20
0 / 100
1095 ms18624 KiB
#include <bits/stdc++.h> #define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) #define all(a) a.begin() , a.end() #define F first #define S second using namespace std; using ll = long long; const ll N = 2e5+5 , inf = 2e9 + 7; const ll INF = 1e18 , mod = 1e9+7; ll a[N] , b[N] , mx , mx2 , par[N] , was[N] , dp[N]; vector<int> g[N] , vec; map<pair<int,int> ,int> mp; void dfs(int v, int p){ par[v] = p; // cout << v <<" " << dp[v] << "\n"; if(mx != v && dp[v] > dp[mx2] && was[v] == 0 && g[v].size() == 1) mx2 = v; for(int to : g[v]){ if(to != p){ if(mp[{v,to}] == 1){ dp[to] = dp[v]-1; } else { dp[to] = dp[v]+1; } dfs(to,v); } } } void solve(){ int n , q; cin >> n >> q; for(int i = 1; i < n; i++){ cin >> a[i] >> b[i]; } while(q--){ int k; cin >> k; for(int i = 1; i <= n+k; i++) g[i].clear() , was[i] = par[i] = 0; for(int i = 1; i < n; i++){ g[a[i]].push_back(b[i]); g[b[i]].push_back(a[i]); } for(int i = 1; i <= k; i++){ int a; cin >> a; g[a].push_back(i+n); g[i+n].push_back(a); } int res = 0; for(int i = 1; i <= n+k; i++){ if(g[i].size() == 1) res++; } // cout << res << "\n"; // return; if(res % 2){ cout << "-1\n"; continue;; } // return; int ans = 0 , cnt = 0; mp.clear(); // int k1 = 4; dp[n+k+1] = -inf; while(1){ for(int i = 1; i <= n+k; i++) dp[i] = 0; for(int i = 1; i <= n+k; i++){ if(g[i].size() == 1 && was[i] == 0){ mx = i; break; } } mx2 = n+k+1; dp[mx] = 0; dfs(mx,0); mx = mx2; mx2 = n+k+1; dp[mx] = 0; dfs(mx,0); // cout << mx <<" " << mx2 <<"\n"; mx = mx2; vector<int> path; while(mx > 0){ path.push_back(mx); mx = par[mx]; } // cout << path[0] <<" " << path.back() <<"\n"; for(int i = 0; i + 1 < path.size(); i++){ if(mp[{path[i] , path[i+1]}] == 0){ cnt++; } mp[{path[i],path[i+1]}] = 1; mp[{path[i+1],path[i]}] = 1; } was[path.back()] = was[path[0]] = 1; ans += path.size()-1; if(cnt == n+k-1) break; } cout << ans << "\n"; } } /* */ signed main(){ ios; solve(); }
#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...