Submission #574533

#TimeUsernameProblemLanguageResultExecution timeMemory
574533piOOESpring cleaning (CEOI20_cleaning)C++17
0 / 100
87 ms13756 KiB
#include <bits/stdc++.h> using namespace std; #define sz(x) ((int)size(x)) #define all(x) begin(x), end(x) #define trace(x) cout << #x << ": " << (x) << endl; typedef long long ll; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return (int) ((ll) rnd() % (r - l + 1)) + l; } const int N = 200000, infI = 1e9 + 7; const ll infL = 3e18; vector<int> g[N]; ll dp[3][N];//LL??? int depth[N], parent[N]; void pull(int v) { dp[0][v] = 0; dp[1][v] = dp[2][v] = infL; if (sz(g[v]) <= 1) { //v is a leaf dp[1][v] = 1; } else { for (int to: g[v]) { if (to != parent[v]) { array<ll, 3> dq = {dp[0][v], dp[1][v], dp[2][v]}; dp[0][v] = min({dq[2] + dp[2][to], dq[1] + dp[1][to]}); dp[1][v] = min({dq[0] + dp[1][to], dq[2] + dp[1][to], dq[1] + dp[2][to]}); dp[2][v] = min({dq[0] + dp[2][to], dq[2] + dp[2][to], dq[1] + dp[1][to]}); } } dp[1][v] += 1; dp[2][v] += 2; } } void dfs(int v, int p) { if (p != -1) { depth[v] = depth[p] + 1; } parent[v] = p; dp[0][v] = 0; dp[1][v] = dp[2][v] = infL; if (sz(g[v]) <= 1) { //v is a leaf dp[1][v] = 1; } else { for (int to: g[v]) { if (to != p) { dfs(to, v); array<ll, 3> dq = {dp[0][v], dp[1][v], dp[2][v]}; dp[0][v] = min({dq[2] + dp[2][to], dq[1] + dp[1][to]}); dp[1][v] = min({dq[0] + dp[1][to], dq[2] + dp[1][to], dq[1] + dp[2][to]}); dp[2][v] = min({dq[0] + dp[2][to], dq[2] + dp[2][to], dq[1] + dp[1][to]}); } } dp[1][v] += 1; dp[2][v] += 2; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; int root = -1; for (int i = 0; i < n - 1; ++i) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); g[b].push_back(a); } int mxx = 0; for (int i = 0; i < n; ++i) { mxx = max(mxx, sz(g[i])); } for (int i = 0; i < n; ++i) { if (sz(g[i]) > 1) { root = i; break; } } assert(root != -1); dfs(root, -1); // trace(dp[0][root]); while (q--) { int D; cin >> D; vector<int> a(D); for (int i = 0; i < D; ++i) { cin >> a[i]; --a[i]; } if (D == 1) { if (sz(g[a[0]]) == 1) { cout << (dp[0][root] >= infL ? -1 : dp[0][root] + 1) << '\n'; } else { cout << (dp[1][root] >= infL ? -1 : dp[1][root] + depth[a[0]]) << '\n'; } } } 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...