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;
typedef long long ll;
const int maxn = 1e5+10, maxk = 110;
int n, k;
ll dp[maxn][maxk], dp2[maxn][maxk], ant[maxn][maxk], ans, vis[maxn], vet[maxn];
vector <int> graph[maxn];
void solve(int u, int f = 0)
{
for(int v: graph[u])
{
if(v == f) continue;
solve(v, u);
for(int i = 1 ; i <= k ; ++i)
{
ll val = max(dp[v][i-1] + vis[v] - vet[u], dp[v][i]);
if(val > dp[u][i]) dp2[u][i] = dp[u][i], dp[u][i] = val;
else if(val > dp2[u][i]) dp2[u][i] = val;
}
}
}
void rotate(int u, int f = 0)
{
for(int i = 1 ; i <= k ; ++i)
{
ans = max({ans, dp[u][i], dp[u][i-1] + vis[u]});
}
for(int v: graph[u])
{
if(v == f) continue;
for(int i = 1 ; i <= k ; ++i)
{
ant[u][i] = dp[u][i];
ll val = max(dp[v][i], dp[v][i-1] + vis[v] - vet[u]);
if(val == dp[u][i])
{
dp[u][i] = dp2[u][i];
}
}
for(int i = 1 ; i <= k ; ++i)
{
ll val = max(dp[u][i], dp[u][i-1] + vis[u] - vet[v]);
if(val > dp[v][i]) dp2[v][i] = dp[v][i], dp[v][i] = val;
else if(val > dp2[v][i]) dp2[v][i] = val;
}
rotate(v, u);
for(int i = 1 ; i <= k ; ++i) dp[u][i] = ant[u][i];
}
}
int main()
{
cin >> n >> k;
for(int i = 1 ; i <= n ; ++i) cin >> vet[i];
for(int i = 1 ; i < n ; ++i)
{
int u, v;
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
for(int i = 1 ; i <= n ; ++i)
{
for(int v: graph[i])
{
vis[i] += vet[v];
}
}
solve(1);
rotate(1);
cout << ans << '\n';
}
# | 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... |