蒟蒻对着看了30min都不知道哪里错了,样例全对,自己造的数据也没问题
#include<bits/stdc++.h>
using namespace std;
template<class T>
void in(T &x){
char c=getchar();T f=1; x=0;
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
x*=f;
}
const int N=200010;
typedef long long ll;
vector<int> g[N];
int n,k,a[N],u,v;
ll f[N][6][3];
void dfs(int u,int fa){
int c=0;
f[u][0][0]=0;
for(int v:g[u]){
if(v!=fa){
dfs(v,u);
c++;
for(int j=5;j>=0;j--)
for(int k=j;k>=0;k--)
for(int l=2;l>=0;l--){
int tmp=f[u][k][l];
f[u][j][l]=max(f[u][j][l],tmp+f[v][j-k][0]);
if(l<=1)f[u][j][l+1]=max(f[u][j][l+1],tmp+f[v][j-k][1]);
// printf("%d %d %d:%lld\n",u,j,l+1,f[u][j][l+1]);
}
}
}
// printf("%d:\n",u);
for(int j=5;j>=0;j--){
// printf("%d\n",f[u][j][2]);
ll tmp=j?f[u][j-1][1]+a[u]:0;
f[u][j][1]=max(f[u][j][1]+a[u],f[u][j][0]+a[u]);
f[u][j][0]=max(tmp,f[u][j][0]);
if(j) f[u][j][0]=max(f[u][j][0],f[u][j-1][2]+a[u]);
// printf("%d %d\n",f[u][j][0],f[u][j][1]);
}
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
in(n); in(k);
for(int i=1;i<=n;i++) in(a[i]);
for(int i=1;i<n;i++){
in(u); in(v);
g[u].push_back(v);
g[v].push_back(u);
}
memset(f,0xc0,sizeof(f));
dfs(1,0);
printf("%lld",f[1][k][0]);
return 0;
}