#include <bits/stdc++.h>
#define int int64_t
const int N = 1e5 + 5;
std::vector<int> p(N);
std::vector<int> Dsu[N];
std::vector<int> sum(N);
std::vector<int> a(N);
struct dsu {
void add(int i) {
p[i] = i;
Dsu[i].push_back(i);
sum[i] = a[i];
}
int parent(int u) {
return p[u];
}
int Get(int u) {
return sum[p[u]];
}
void connect(int u, int v) {
u = p[u];
v = p[v];
if(u == v) {
return;
}
if(Dsu[u].size() > Dsu[v].size()) {
std::swap(u, v);
}
for(auto e : Dsu[u]) {
Dsu[v].push_back(e);
p[e] = v;
sum[v] += a[e];
}
Dsu[u].clear();
}
}dsu;
signed main() {
int n, k;
std::cin >> n >> k;
for(int i = 1; i <= n; i++) {
std::cin >> a[i];
}
for(int i = 1; i <= n; i++) {
dsu.add(i);
}
std::vector<int> adj[n + 1];
for(int i = 1; i < n; i++) {
int u, v;
std::cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
std::function<void(int, int)> dfs = [&] (int v, int p) {
for(auto u : adj[v]) {
if(u == p) {
continue;
}
dfs(u, v);
}
if(adj[v].size() == 1) {
// create
return;
}
std::vector<std::array<int, 2>> t;
for(auto u : adj[v]) {
if(u == p) {
continue;
}
t.push_back({dsu.Get(u), dsu.parent(u)});
}
std::sort(t.begin(), t.end());
for(int i = 0; i < t.size(); i++) {
if(dsu.Get(dsu.parent(v)) + t[i][0] <= k) {
dsu.connect(dsu.parent(v), t[i][1]);
}
}
};
dfs(1, 0);
std::set<int> st;
for(int i = 1; i <= n; i++) {
st.insert(dsu.parent(i));
}
std::cout << ((int)st.size()) - 1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |