Submission #1358931

#TimeUsernameProblemLanguageResultExecution timeMemory
1358931gkos5678Paprike (COI18_paprike)C++20
0 / 100
1095 ms14320 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

typedef long long ll;
typedef vector<int> vi;

const int maxn = 1e5 + 7;

ll n, k, h[maxn], sb[maxn], p[maxn];
vi ls[maxn];

void dfs1(int v){
    for (int ss : ls[v]){
        if (ss == p[v]) continue;
        p[ss] = v;
        dfs1(ss);
    }
}

void dfs2(int v){
    sb[v] = h[v];
    for (int ss : ls[v]){
        if (ss == p[v]) continue;
        dfs2(ss);
        sb[v] += sb[ss];
    }
}

void dfs3(int v){
    h[v] = 0;
    for (int ss : ls[v]){
        if (ss == p[v]) continue;
        dfs3(ss);
    }
}

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

    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        cin >> h[i];
    for (int i = 1; i < n; i++){
        int x, y;
        cin >> x >> y;
        ls[x].pb(y);
        ls[y].pb(x);
    }

    dfs1(1);
    ll ans = 0, uk = 0;
    for (int i = 1; i <= n; i++)
        uk += h[i];
    while(uk > k){
        dfs2(1);
        ll mx = 0, mxi = -1;
        for (int i = 1; i <= n; i++){
            if (sb[i] > mx && sb[i] <= k){
                mx = sb[i];
                mxi = i;
            }
        }
        ans++;
        uk -= sb[mxi];
        dfs3(mxi);
    }
    cout << ans << "\n";
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...