Submission #1337065

#TimeUsernameProblemLanguageResultExecution timeMemory
1337065biankChase (CEOI17_chase)C++20
100 / 100
322 ms254624 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
 
using vi = vector<int>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vb = vector<bool>;
using pll = pair<ll, ll>;
using i128 = __int128;

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

#define pb push_back
#define eb emplace_back

#define fst first
#define snd second

const int MAX_N = 1e5 + 20, MAX_V = 105;

ll dpUp[MAX_N][MAX_V], dpDown[MAX_N][MAX_V];
vi adj[MAX_N];
int p[MAX_N], par[MAX_N];
ll s[MAX_N];
int n, v;

void dfs(int a) {
    forsn(i, 1, v + 1) dpUp[a][i] = s[a];
    for (int b : adj[a]) if (b != par[a]) {
        par[b] = a;
        dfs(b);
        forn(i, v + 1) dpUp[a][i] = max(dpUp[a][i], dpUp[b][i]);
        forsn(i, 1, v + 1) dpUp[a][i] = max(dpUp[a][i], dpUp[b][i - 1] + s[a] - p[b]);
        forn(i, v + 1) dpDown[a][i] = max(dpDown[a][i], dpDown[b][i]);
        forsn(i, 1, v + 1) dpDown[a][i] = max(dpDown[a][i], dpDown[b][i - 1] + s[b] - p[a]);
    }
}

int main() {
    ios::sync_with_stdio(0);                
    cin.tie(0); cout.tie(0);
    
    cin >> n >> v;
    forn(i, n) cin >> p[i];
    forn(i, n - 1) {
        int a, b;
        cin >> a >> b;
        --a, --b;
        adj[a].pb(b);
        adj[b].pb(a);
        s[a] += p[b];
        s[b] += p[a];
    }
    
    dfs(0);
    
    ll ret = 0;
    forn(a, n) {
        ret = max({ret, dpUp[a][v], dpDown[a][v], v == 0 ? 0 : dpDown[a][v - 1] + s[a]});
        const int m = sz(adj[a]);
        vector<vll> pref(m + 1, vll(v + 1, 0));
        forsn(j, 1, v + 1) pref[0][j] = s[a];
        forn(i, m) {
            pref[i + 1] = pref[i];
            int b = adj[a][i];
            if (b == par[a]) continue;
            forn(j, v + 1) pref[i + 1][j] = max(pref[i + 1][j], dpUp[b][j]);
            forsn(j, 1, v + 1) pref[i + 1][j] = max(pref[i + 1][j], dpUp[b][j - 1] + s[a] - p[b]);
        }
        vector<vll> suff(m + 1, vll(v + 1, 0));
        forsn(j, 1, v + 1) suff[m][j] = s[a];
        dforn(i, m) {
            suff[i] = suff[i + 1];
            int b = adj[a][i];
            if (b == par[a]) continue;
            forn(j, v + 1) suff[i][j] = max(suff[i][j], dpUp[b][j]);
            forsn(j, 1, v + 1) suff[i][j] = max(suff[i][j], dpUp[b][j - 1] + s[a] - p[b]);
        }
        forn(i, m) {
            int b = adj[a][i];
            if (b == par[a]) continue;
            forn(j, v + 1) {
                ll best = max(pref[i][j], suff[i + 1][j]);
                ret = max(ret, best + dpDown[b][v - j]);
                if (v - j - 1 >= 0) ret = max(ret, best + dpDown[b][v - j - 1] + s[b] - p[a]);
            }
        }
    }
    cout << ret << '\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...