제출 #1293964

#제출 시각아이디문제언어결과실행 시간메모리
1293964chill7foPaprike (COI18_paprike)C++20
13 / 100
28 ms8268 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; ll k; if (!(cin >> n >> k)) return 0; vector<ll> b(n+1); for (int i = 1; i <= n; ++i) cin >> b[i]; vector<vector<int>> g(n+1); for (int i = 0; i < n-1; ++i) { int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } if (n == 1) { if (b[1] > k) cout << 1 << "\n"; else cout << 0 << "\n"; return 0; } auto farthest_from = [&](int s) { vector<int> dist(n+1, -1); queue<int> q; q.push(s); dist[s] = 0; int best = s; while (!q.empty()) { int v = q.front(); q.pop(); if (dist[v] > dist[best]) best = v; for (int u: g[v]) if (dist[u] == -1) { dist[u] = dist[v] + 1; q.push(u); } } return best; }; int a = farthest_from(1); int bnode = farthest_from(a); auto solve = [&](int root)->ll { vector<int> parent(n+1, 0); vector<int> order; order.reserve(n); vector<int> st; st.push_back(root); parent[root] = 0; while (!st.empty()) { int v = st.back(); st.pop_back(); order.push_back(v); for (int u: g[v]) { if (u == parent[v]) continue; parent[u] = v; st.push_back(u); } } vector<ll> sum(n+1, 0); for (int i = 1; i <= n; ++i) sum[i] = b[i]; ll cuts = 0; for (int idx = (int)order.size() - 1; idx >= 0; --idx) { int v = order[idx]; if (sum[v] > k) { cuts++; sum[v] = 0; } int p = parent[v]; if (p != 0 && sum[v] > 0) { if (sum[p] + sum[v] > k) { cuts++; } else { sum[p] += sum[v]; } } } return cuts; }; ll ans1 = solve(a); ll ans2 = solve(bnode); ll ans = min(ans1, ans2); cout << ans << "\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...