제출 #578097

#제출 시각아이디문제언어결과실행 시간메모리
578097talant117408Spring cleaning (CEOI20_cleaning)C++17
16 / 100
339 ms13780 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]; ll ans; void dfs(int v, int p) { subtree[v] = (sz(new_graph[v]) == 1 ? 1 : 0); for (auto to : new_graph[v]) { if (to == p) { continue; } 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 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); } 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; } } } int main() { do_not_disturb 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...