# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
468646 |
2021-08-29T08:16:06 Z |
idk321 |
Chase (CEOI17_chase) |
C++17 |
|
941 ms |
524292 KB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005;
const int V = 101;
int p[N];
int n, v;
vector<int> adj[N];
struct comp {
bool operator () (const array<ll,2>& ar1, const array<ll,2>& ar2) const {
return ar1 > ar2;
}
};
bool comp_fn (const array<ll,2>& ar1, const array<ll,2>& ar2) {
return ar1 > ar2;
}
struct SetLike {
vector<array<ll, 2>> v;
};
vector<array<ll, 2>>::iterator sbegin(vector<array<ll, 2>>& v) {
return v.begin();
}
vector<array<ll, 2>>::iterator send(vector<array<ll, 2>>& v) {
return v.end();
}
void sinsert(vector<array<ll, 2>>& v, array<ll, 2> ar) {
v.push_back(ar);
sort(v.begin(), v.end(), comp_fn);
if (v.size() > 2) v.pop_back();
}
vector<array<ll, 2>> dpSet[N][V];
ll dp[N][V];
ll defaultValue[N];
void dfs(int node, int par) {
ll val1 = 0;
for (int next : adj[node]) {
defaultValue[node] += p[next];
if (next == par) {
continue;
}
val1 += p[next];
dfs(next, node);
}
dp[node][1] = max(dp[node][1], val1);
for (int next : adj[node]) {
if (next == par) continue;
for (int i = 0; i <= v; i++) {
sinsert(dpSet[node][i], {dp[next][i], next});
if (i != v) dp[node][i + 1] = max(dp[node][i + 1], dp[next][i] + val1);
dp[node][i] = max(dp[node][i], dp[next][i]);
}
}
for (int i = 0; i <= v; i++) {
sinsert(dpSet[node][i], {0, node});
sinsert(dpSet[node][i], {0, node});
}
}
void transferRoot(int first, int second) {
for (int i = 0; i <= v; i++) {
auto it0 = sbegin(dpSet[first][i]);
if ((*it0)[1] == second) it0++;
ll val0 = 0;
if (it0 != send(dpSet[first][i])) val0 = (*it0)[0];
sinsert(dpSet[second][i], {val0, first});
dp[second][i] = max(dp[second][i], val0);
if (i != v) {
sinsert(dpSet[second][i + 1], {val0 + defaultValue[first] - p[second], first});
dp[second][i + 1] = max(dp[second][i + 1], val0 + defaultValue[first] - p[second]);
dp[second][i + 1] = max(dp[second][i + 1], val0 + defaultValue[second]);
}
if (i + 2 <= v) {
dp[second][i + 2] = max(dp[second][i + 2], val0 + defaultValue[first] - p[second] + defaultValue[second]);
}
}
for (int next : adj[second]) {
if (next == first) continue;
for (int i = 0; i <= v; i++) {
if (i != v) dp[second][i + 1] = max(dp[second][i + 1], dp[next][i] + defaultValue[second]);
dp[second][i] = max(dp[second][i], dp[next][i]);
}
}
}
ll result = 0;
void dfsRoot(int node, int par) {
for (int i = 0; i <= v; i++) {
result = max(result, dp[node][i]);
}
for (int next : adj[node]) {
if (next == par) continue;
transferRoot(node, next);
dfsRoot(next, node);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> v;
for (int i = 1; i <= n; i++) cin >> p[i];
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
dfs(1, -1);
dfsRoot(1, -1);
cout << result << "\n";
}
/*
12 2
2 3 3 8 1 5 6 7 8 3 5 4
2 1
2 7
3 4
4 7
7 6
5 6
6 8
6 9
7 10
10 11
10 12
*/
/*
10 3
10 1 1 1 1 10 1 10 1 10
1 2
2 3
3 4
4 5
5 6
3 7
7 8
9 4
9 10
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
239784 KB |
Output is correct |
2 |
Correct |
141 ms |
239812 KB |
Output is correct |
3 |
Correct |
141 ms |
239940 KB |
Output is correct |
4 |
Correct |
145 ms |
239828 KB |
Output is correct |
5 |
Correct |
144 ms |
239812 KB |
Output is correct |
6 |
Correct |
143 ms |
239828 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
239784 KB |
Output is correct |
2 |
Correct |
141 ms |
239812 KB |
Output is correct |
3 |
Correct |
141 ms |
239940 KB |
Output is correct |
4 |
Correct |
145 ms |
239828 KB |
Output is correct |
5 |
Correct |
144 ms |
239812 KB |
Output is correct |
6 |
Correct |
143 ms |
239828 KB |
Output is correct |
7 |
Correct |
193 ms |
248772 KB |
Output is correct |
8 |
Correct |
150 ms |
241196 KB |
Output is correct |
9 |
Correct |
149 ms |
241100 KB |
Output is correct |
10 |
Correct |
183 ms |
248712 KB |
Output is correct |
11 |
Correct |
158 ms |
243228 KB |
Output is correct |
12 |
Correct |
148 ms |
241504 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
941 ms |
524292 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
239784 KB |
Output is correct |
2 |
Correct |
141 ms |
239812 KB |
Output is correct |
3 |
Correct |
141 ms |
239940 KB |
Output is correct |
4 |
Correct |
145 ms |
239828 KB |
Output is correct |
5 |
Correct |
144 ms |
239812 KB |
Output is correct |
6 |
Correct |
143 ms |
239828 KB |
Output is correct |
7 |
Correct |
193 ms |
248772 KB |
Output is correct |
8 |
Correct |
150 ms |
241196 KB |
Output is correct |
9 |
Correct |
149 ms |
241100 KB |
Output is correct |
10 |
Correct |
183 ms |
248712 KB |
Output is correct |
11 |
Correct |
158 ms |
243228 KB |
Output is correct |
12 |
Correct |
148 ms |
241504 KB |
Output is correct |
13 |
Runtime error |
941 ms |
524292 KB |
Execution killed with signal 9 |
14 |
Halted |
0 ms |
0 KB |
- |