Submission #67966833
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll NEG = -(4LL << 60);
int N, K;
vector<ll> A;
vector<vector<int>> g;
struct DP {
vector<ll> closed;
vector<ll> open;
};
DP dfs(int u, int p) {
vector<ll> white(K + 1, NEG);
vector<vector<ll>> open(2, vector<ll>(K + 1, NEG));
vector<vector<ll>> closed(3, vector<ll>(K + 1, NEG));
white[0] = 0;
open[0][0] = A[u];
closed[0][0] = A[u];
for (int v : g[u]) if (v != p) {
DP child = dfs(v, u);
vector<ll> nwhite(K + 1, NEG);
vector<vector<ll>> nopen(2, vector<ll>(K + 1, NEG));
vector<vector<ll>> nclosed(3, vector<ll>(K + 1, NEG));
for (int p1 = 0; p1 <= K; ++p1) if (white[p1] > NEG/2)
for (int p2 = 0; p1 + p2 <= K; ++p2) if (child.closed[p2] > NEG/2)
nwhite[p1 + p2] = max(nwhite[p1 + p2], white[p1] + child.closed[p2]);
for (int k = 0; k <= 1; ++k)
for (int p1 = 0; p1 <= K; ++p1) if (open[k][p1] > NEG/2)
for (int p2 = 0; p1 + p2 <= K; ++p2) {
if (child.closed[p2] > NEG/2)
nopen[k][p1 + p2] = max(nopen[k][p1 + p2],
open[k][p1] + child.closed[p2]);
if (child.open[p2] > NEG/2 && k + 1 <= 1)
nopen[k + 1][p1 + p2] = max(nopen[k + 1][p1 + p2],
open[k][p1] + child.open[p2]);
}
for (int k = 0; k <= 2; ++k)
for (int p1 = 0; p1 <= K; ++p1) if (closed[k][p1] > NEG/2)
for (int p2 = 0; p1 + p2 <= K; ++p2) {
if (child.closed[p2] > NEG/2)
nclosed[k][p1 + p2] = max(nclosed[k][p1 + p2],
closed[k][p1] + child.closed[p2]);
if (child.open[p2] > NEG/2 && k + 1 <= 2)
nclosed[k + 1][p1 + p2] = max(nclosed[k + 1][p1 + p2],
closed[k][p1] + child.open[p2]);
}
white.swap(nwhite);
open.swap(nopen);
closed.swap(nclosed);
}
DP res;
res.closed.assign(K + 1, NEG);
res.open.assign(K + 1, NEG);
for (int p = 0; p <= K; ++p)
res.open[p] = max(open[0][p], open[1][p]);
for (int p = 0; p <= K; ++p)
res.closed[p] = max(res.closed[p], white[p]);
for (int p = 0; p <= K; ++p) {
if (p + 1 <= K && closed[0][p] > NEG/2)
res.closed[p + 1] = max(res.closed[p + 1], closed[0][p]);
if (p + 1 <= K && closed[1][p] > NEG/2)
res.closed[p + 1] = max(res.closed[p + 1], closed[1][p]);
if (p + 1 <= K && closed[2][p] > NEG/2)
res.closed[p + 1] = max(res.closed[p + 1], closed[2][p]);
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> K;
A.resize(N + 1);
for (int i = 1; i <= N; ++i) cin >> A[i];
g.assign(N + 1, {});
for (int i = 1; i < N; ++i) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
DP root = dfs(1, 0);
ll ans = 0;
for (int p = 0; p <= K; ++p) ans = max(ans, root.closed[p]);
cout << ans << '\n';
return 0;
}
Submission Info
| Submission Time |
|
| Task |
F - Paint Tree 2 |
| User |
Kifff12 |
| Language |
C++ 20 (gcc 12.2) |
| Score |
525 |
| Code Size |
3569 Byte |
| Status |
AC |
| Exec Time |
289 ms |
| Memory |
218848 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
525 / 525 |
| Status |
|
|
| Set Name |
Test Cases |
| 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 |
| Case Name |
Status |
Exec Time |
Memory |
| 00_sample_00.txt |
AC |
1 ms |
3532 KiB |
| 00_sample_01.txt |
AC |
1 ms |
3604 KiB |
| 00_sample_02.txt |
AC |
1 ms |
3540 KiB |
| 01_handmade_00.txt |
AC |
1 ms |
3456 KiB |
| 01_handmade_01.txt |
AC |
1 ms |
3548 KiB |
| 02_random_00.txt |
AC |
22 ms |
4916 KiB |
| 02_random_01.txt |
AC |
152 ms |
13288 KiB |
| 02_random_02.txt |
AC |
38 ms |
5976 KiB |
| 02_random_03.txt |
AC |
37 ms |
6456 KiB |
| 02_random_04.txt |
AC |
154 ms |
13788 KiB |
| 02_random_05.txt |
AC |
192 ms |
15924 KiB |
| 02_random_06.txt |
AC |
191 ms |
15952 KiB |
| 02_random_07.txt |
AC |
196 ms |
16068 KiB |
| 02_random_08.txt |
AC |
199 ms |
16000 KiB |
| 02_random_09.txt |
AC |
194 ms |
16076 KiB |
| 02_random_10.txt |
AC |
175 ms |
16532 KiB |
| 02_random_11.txt |
AC |
174 ms |
16524 KiB |
| 02_random_12.txt |
AC |
254 ms |
181416 KiB |
| 02_random_13.txt |
AC |
289 ms |
218848 KiB |
| 02_random_14.txt |
AC |
268 ms |
154608 KiB |
| 02_random_15.txt |
AC |
285 ms |
170184 KiB |
| 02_random_16.txt |
AC |
273 ms |
171240 KiB |
| 02_random_17.txt |
AC |
286 ms |
171244 KiB |
| 02_random_18.txt |
AC |
178 ms |
15736 KiB |
| 02_random_19.txt |
AC |
195 ms |
15696 KiB |