提出 #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 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |