提出 #67966529


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

const long long inf = 1e18+3;

void solve() {
	int n, k;
	cin >> n >> k;
	vector<long long> a(n+1);
	for (int i=1; i<=n; i++) cin >> a[i];
	vector<vector<int>> adjl(n+1);
	for (int i=1; i<n; i++) {
		int u, v;
		cin >> u >> v;
		adjl[u].push_back(v);
		adjl[v].push_back(u);
	}

	vector<vector<vector<long long>>> dp(n+1, vector<vector<long long>>(k+1, vector<long long>(2, -inf)));
	auto dfs = [&](auto &self, int u, int p) -> void {
		dp[u][0][0] = dp[u][1][1] = a[u];
		dp[u][0][1] = 0;
		
		for (int &v : adjl[u]) {
			if (v == p) {
				swap(v, adjl[u][0]);
				break;
			}
		}

		int m = (int)adjl[u].size();
		int s = (u == 1 ? 0 : 1);

		for (int i=s; i<m; i++) {
			int v = adjl[u][i];
			self(self, v, u);
		}

		vector<vector<vector<long long>>> cdp(m+1, vector<vector<long long>>(k+1, vector<long long>(3, -inf)));
		cdp[s][0][0] = 0;

		for (int i=s+1; i<=m; i++) {
			int v = adjl[u][i-1];
			for (int ck=0; ck<=k; ck++) {
				// not merge path with i-th child
				for (int pk=0; pk<=ck; pk++) {
					for (int l=0; l<3; l++) {
						cdp[i][ck][l] = max(cdp[i][ck][l], cdp[i-1][pk][l] + dp[v][ck-pk][1]);
					}
				}
				for (int pk=0; pk<ck; pk++) {
					for (int l=0; l<3; l++) {
						cdp[i][ck][l] = max(cdp[i][ck][l], cdp[i-1][pk][l] + dp[v][ck-pk-1][0]);
					}
				}

				// merge path with i-th child
				for (int pk=0; pk<=ck; pk++) {
					for (int l=1; l<3; l++) {
						cdp[i][ck][l] = max(cdp[i][ck][l], cdp[i-1][pk][l-1] + dp[v][ck-pk][0]);
					}
				}
			}
		}

		for (int i=0; i<=k; i++) {
			dp[u][i][0] = max({dp[u][i][0], cdp[m][i][0] + a[u], cdp[m][i][1] + a[u]});
			dp[u][i][1] = max(dp[u][i][1], cdp[m][i][0]);
			if (i > 0) {
				dp[u][i][1] = max({dp[u][i][1], cdp[m][i-1][0] + a[u], cdp[m][i-1][1] + a[u], cdp[m][i-1][2] + a[u]});
			}
		}
	};
	dfs(dfs, 1, 0);

	long long ans = -inf;
	for (int i=0; i<=k; i++) {
		ans = max(ans, dp[1][i][1]);
		if (i > 0) ans = max(ans, dp[1][i-1][0]);
	}

	cout << ans << '\n';
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int tcs = 1;
	// cin >> tcs;
	while (tcs--) {
		solve();
	}
	return 0;
}

提出情報

提出日時
問題 F - Paint Tree 2
ユーザ Wie
言語 C++ 20 (gcc 12.2)
得点 525
コード長 2226 Byte
結果 AC
実行時間 421 ms
メモリ 163192 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 525 / 525
結果
AC × 3
AC × 25
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_handmade_00.txt, 01_handmade_01.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt, 02_random_12.txt, 02_random_13.txt, 02_random_14.txt, 02_random_15.txt, 02_random_16.txt, 02_random_17.txt, 02_random_18.txt, 02_random_19.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3508 KiB
00_sample_01.txt AC 1 ms 3500 KiB
00_sample_02.txt AC 1 ms 3384 KiB
01_handmade_00.txt AC 1 ms 3424 KiB
01_handmade_01.txt AC 1 ms 3424 KiB
02_random_00.txt AC 38 ms 14116 KiB
02_random_01.txt AC 202 ms 53752 KiB
02_random_02.txt AC 66 ms 21536 KiB
02_random_03.txt AC 38 ms 13820 KiB
02_random_04.txt AC 212 ms 55400 KiB
02_random_05.txt AC 172 ms 45612 KiB
02_random_06.txt AC 181 ms 45712 KiB
02_random_07.txt AC 289 ms 76660 KiB
02_random_08.txt AC 261 ms 67256 KiB
02_random_09.txt AC 295 ms 76656 KiB
02_random_10.txt AC 421 ms 163192 KiB
02_random_11.txt AC 413 ms 163136 KiB
02_random_12.txt AC 178 ms 95176 KiB
02_random_13.txt AC 296 ms 139124 KiB
02_random_14.txt AC 259 ms 87292 KiB
02_random_15.txt AC 356 ms 118372 KiB
02_random_16.txt AC 233 ms 92344 KiB
02_random_17.txt AC 275 ms 101508 KiB
02_random_18.txt AC 203 ms 67216 KiB
02_random_19.txt AC 316 ms 89060 KiB