제출 #571884

#제출 시각아이디문제언어결과실행 시간메모리
571884piOOEChase (CEOI17_chase)C++17
100 / 100
648 ms188892 KiB
#include <bits/stdc++.h> using namespace std; #define sz(x) ((int)size(x)) #define all(x) begin(x), end(x) #define trace(x) cout << #x << ": " << (x) << endl; typedef long long ll; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return (int) ((ll) rnd() % (r - l + 1)) + l; } const int N = 100001; const ll infL = 3e18; vector<int> g[N]; int n, k; ll p[N], sum[N], ans = 0; vector<ll> up[N], down[N]; vector<ll> insert(vector<ll> x, ll v) { assert(sz(x) == k + 1); for (int i = k; i > 0; --i) { x[i] = max(x[i], x[i - 1] + v); } for (int i = 1; i <= k; ++i) { x[i] = max(x[i], x[i - 1]); } return x; } vector<ll> getmax(vector<ll> a, vector<ll> b) { assert(sz(a) == k + 1 && sz(b) == k + 1); for (int i = 0; i <= k; ++i) a[i] = max(a[i], b[i]); return a; } void dfs(int v, int par) { for (int to: g[v]) { if (to != par) { dfs(to, v); } } for (int cnt = 0; cnt < 2; ++cnt) { vector<ll> mx(k + 1); for (int to: g[v]) { if (to != par) { for (int i = 0; i <= k; ++i) { ans = max(ans, down[to][i] + mx[k - i]); } mx = getmax(mx, insert(up[to], sum[v] - p[to])); } } reverse(all(g[v])); } up[v] = insert(up[v], sum[v]); down[v] = insert(down[v], sum[v] - (par == -1 ? 0 : p[par])); for (int to: g[v]) { if (to != par) { ans = max(ans, up[to][k - 1] + sum[v] - p[to]); ans = max(ans, down[to][k - 1] + sum[v]); up[v] = getmax(up[v], insert(up[to], sum[v] - p[to])); down[v] = getmax(down[v], insert(down[to], sum[v] - (par == -1 ? 0 : p[par]))); } } ans = max({ans, up[v][k], down[v][k]}); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> p[i]; up[i].resize(k + 1); down[i].resize(k + 1); } for (int i = 1; i < n; ++i) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); g[b].push_back(a); } if (k == 0) { cout << 0; return 0; } for (int v = 0; v < n; ++v) { for (int to: g[v]) { sum[v] += p[to]; } } dfs(0, -1); cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...