比赛 2025暑期集训第4场 评测结果 AWWWWWWWWW
题目名称 外卖 最终得分 10
用户昵称 OTTF 运行时间 0.362 s
代码语言 C++ 内存使用 5.86 MiB
提交时间 2025-07-05 11:37:03
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

constexpr int N = 514;

int n;
int m;
long long nums[N];
vector<int> tree[N];
long long dp[N][N][2][2];
long long res;

inline long long get (int u, int t, bool one, bool two) {
	return (t >= 0 ? dp[u][t][one][two] : 0);
}

void display () {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << dp[i][j][0][0] << ' ' << dp[i][j][1][0] << ' ' << dp[i][j][0][1] << ' ' << dp[i][j][1][1] << endl;
		}
	}
}

void dp1 (int now, int dad) {
	if (now != 1 && tree[now].size() == 1) {
		for (int i = 1; i <= m; i++) {
			dp[now][i][1][1] = nums[now];
		}
		return;
	}

	int cc = 0;
	for (auto son : tree[now]) {
		if (son == dad) {
			continue;
		}
		cc++;

		dp1 (son, now);

		int t;
		long long temp;
		for (int i = m; i >= 1; i--) {
			t = i;
			temp = max ({get (son, t - 1, 0, 0), get (son, t - 1, 0, 1), get (son, t - 1, 1, 0), get (son, t - 1, 1, 1)});
			dp[now][i][0][0] = max (dp[now][i][0][0], temp);

			temp = max ({get (son, t - 2, 0, 0), get (son, t - 2, 0, 1), get (son, t - 2, 1, 0), get (son, t - 2, 1, 1)});
			dp[now][i][1][0] = max (dp[now][i][1][0], temp);

			temp = max ({get (son, t - 2, 0, 1), get (son, t - 2, 1, 1)});
			dp[now][i][0][1] = max (dp[now][i][0][1], temp);

			temp = max ({get (son, t - 3, 0, 1), get (son, t - 3, 1, 1)});
			dp[now][i][1][1] = max (dp[now][i][1][1], temp);

			if (cc == 1) {
				continue;
			}

			for (int j = i - 1; j > 0; j--) {
				t = i - j;
				
				temp = max ({get (son, t - 1, 0, 0), get (son, t - 1, 0, 1), get (son, t - 1, 1, 0), get (son, t - 1, 1, 1)});
				dp[now][i][0][0] = max (dp[now][i][0][0], dp[now][j][0][1] + temp);

				temp = max ({get (son, t - 1, 0, 0), get (son, t - 1, 0, 1), get (son, t - 1, 1, 0), get (son, t - 1, 1, 1)});
				dp[now][i][1][0] = max (dp[now][i][1][0], dp[now][j][1][1] + temp);

				temp = max ({get (son, t - 2, 0, 1), get (son, t - 2, 1, 1)});
				dp[now][i][0][1] = max (dp[now][i][0][1], dp[now][j][0][1] + temp);

				temp = max ({get (son, t - 2, 0, 1), get (son, t - 2, 1, 1)});
				dp[now][i][1][1] = max (dp[now][i][1][1], dp[now][j][1][1] + temp);
			}
		}
	}
	
	for (int i = 1; i <= m; i++) {
		dp[now][i][1][1] += nums[now];
		dp[now][i][1][0] += nums[now];
	}
}

int main () {
	
	freopen ("food.in", "r", stdin);
	freopen ("food.out", "w", stdout);

	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> nums[i];
	}
	int u, v;
	for (int i = 1; i < n; i++) {
		cin >> u >> v;
		tree[u].push_back(v);
		tree[v].push_back(u);
	}

	dp1 (1, 0);

	cout << max ({dp[1][m][0][0], dp[1][m][1][0], dp[1][m][0][1], dp[1][m][1][1]}) << endl;
	
	return 0;
}