| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 44714 | bogdan10bos | Chase (CEOI17_chase) | C++14 | 514 ms | 170492 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
//#define FILE_IO
typedef long long LL;
LL ans;
int N, K;
int v[100005];
LL vec[100005];
LL dpup[100005][105], dpdown[100005][105];
LL bstdown[105][2];
vector<int> edg[100005];
void DFS(int nod, int fth)
{
    for(auto nxt: edg[nod])
    {
        if(nxt == fth)  continue;
        DFS(nxt, nod);
    }
    for(int i = 0; i <= K; i++)
        bstdown[i][0] = bstdown[i][1] = 0LL;
    for(auto nxt: edg[nod])
    {
        if(nxt == fth)  continue;
        for(int i = 0; i <= K; i++)
        {
            if(i > 0)
            {
                dpup[nod][i] = max({ dpup[nod][i], dpup[nxt][i], dpup[nxt][i - 1] + vec[nod] - v[nxt] });
                dpdown[nod][i] = max({ dpdown[nod][i], dpdown[nxt][i], dpdown[nxt][i - 1] + vec[nod] - v[fth] });
                dpup[nod][i] = max(dpup[nod][i], dpup[nod][i - 1]), dpdown[nod][i] = max(dpdown[nod][i], dpdown[nod][i - 1]);
                ans = max(ans, dpdown[nxt][i - 1] + vec[nod]);
            }
            ans = max(ans, dpup[nod][i]);
            ans = max(ans, dpdown[nod][i]);
            if(dpdown[nxt][i] > bstdown[i][0])
            {
                bstdown[i][1] = bstdown[i][0];
                bstdown[i][0] = dpdown[nxt][i];
            }
            else if(dpdown[nxt][i] > bstdown[i][1])
                bstdown[i][1] = dpdown[nxt][i];
        }
    }
    for(auto nxt: edg[nod])
    {
        if(nxt == fth)  continue;
        for(int i = 0; i <= K; i++)
        {
            LL nxtbst = bstdown[i][0];
            if(bstdown[i][0] == dpdown[nxt][i]) nxtbst = bstdown[i][1];
            ans = max(ans, dpup[nxt][K - i] + nxtbst);
            if(K - i - 1 >= 0)  ans = max(ans, nxtbst + dpup[nxt][K - i - 1] + vec[nod] - v[nxt]);
        }
    }
    dpup[nod][1] = max(dpup[nod][1], vec[nod]);
}
int main()
{
    #ifdef FILE_IO
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
    #endif
    scanf("%d%d", &N, &K);
    for(int i = 1; i <= N; i++) scanf("%d", &v[i]);
    for(int i = 1; i < N; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        edg[x].push_back(y);
        edg[y].push_back(x);
        vec[x] += v[y];
        vec[y] += v[x];
    }
    ans = 0;
    DFS(1, 0);
    printf("%lld\n", ans);
    return 0;
}
Compilation message (stderr)
| # | 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... | ||||
