Submission #1298192

#TimeUsernameProblemLanguageResultExecution timeMemory
1298192Cebrayil09Paprike (COI18_paprike)C++20
100 / 100
49 ms14760 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int sz = 1e5+5;
int n, k;

vector<vector<array<int,2>>> g(sz);
vector<vector<int>> depthv(sz);
int w[sz], depth[sz];
bool used[sz];

signed main() {
    ios_base::sync_with_stdio(0);
    cout.tie(0);

    cin >> n >> k;
    for(int i = 1;i <= n;i++) cin >> w[i];

    for(int i = 1;i < n;i++) {
        int a, b; cin >> a >> b;

        g[a].push_back({w[b], b});
        g[b].push_back({w[a], a});
    }

    queue<array<int,2>> q;
    q.push({1, 0});
    used[1] = 1;

    int bt = 0;
    while(!q.empty()) {
        int u = q.front()[0];
        int d = q.front()[1];
        q.pop();

        bt = max(bt, d);

        depth[u] = d;
        depthv[d].push_back(u);

        for(auto &[we, to] : g[u]) {
            if(used[to]) continue;

            used[to] = 1;
            q.push({to, d+1});
        }
    }
    bt--;

    int comp_cnt = n;
    for(;bt >= 0;bt--) {
        for(auto &u : depthv[bt]) {
            for(auto &[we, to] : g[u]) we = w[to];
            sort(g[u].begin(), g[u].end());

            for(auto &[we, to] : g[u]) {
                if(depth[to] != bt+1) continue;

                if(w[u] + we <= k) {
                    w[u] += we;
                    comp_cnt--;
                }
            }
        }
    }

    cout << comp_cnt - 1 << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...