Submission #848510

#TimeUsernameProblemLanguageResultExecution timeMemory
848510qthang2k11Chase (CEOI17_chase)C++17
40 / 100
394 ms524288 KiB
#include <bits/stdc++.h> using namespace std; #ifndef LOCAL #define fprintf(...) {} #endif using ll = long long; const int N = 1e5 + 5; template<class X, class Y> inline void maxi(X &x, Y y) { if (x < y) x = y; } vector<int> adj[N], g[N]; int n, k, a[N]; ll s[N]; ll ans = 0, INF; struct Node { ll val[101][2]; Node() { memset(val, -63, sizeof val); } void maxi_(const Node &other) { for (int i = 0; i <= k; i++) for (int j = 0; j < 2; j++) maxi(val[i][j], other.val[i][j]); } void deal(const Node &other, const int &x, const int &y) { // update from y to x for (int i = 0; i <= k; i++) { for (int j = 0; j < 2; j++) { ll cur = other.val[i][j]; // if (i < k) maxi(val[i + 1][1], cur + s[x] - a[y] + (j ? a[y] : 0)); if (i < k) { if (j) maxi(val[i + 1][1], cur + s[x] - a[y]); else maxi(val[i + 1][1], cur + s[x] - a[y]); maxi(val[i + 1][1], cur + s[x] - a[y] - (j ? a[x] : 0)); } // maxi(val[i][0], cur + (j ? a[y] : 0)); maxi(val[i][0], cur/* + (j ? a[x] : 0)*/); } } } Node deal_(const int &x, const int &y) { // update from y to x Node ans; for (int i = 0; i <= k; i++) { for (int j = 0; j < 2; j++) { ll cur = val[i][j]; // if (i < k) maxi(ans.val[i + 1][1], cur + s[x] - a[y] + (j ? a[y] : 0)); if (i < k) { if (j) maxi(ans.val[i + 1][1], cur + s[x] - a[y]); else maxi(ans.val[i + 1][1], cur + s[x] - a[y]); maxi(ans.val[i + 1][1], cur + s[x] - a[y] - (j ? a[x] : 0)); } // maxi(ans.val[i][0], cur + (j ? a[y] : 0)); maxi(ans.val[i][0], cur/* + (j ? a[x] : 0)*/); } } return ans; } ll res() const { ll ans = 0; for (int i = 0; i <= k; i++) for (int j = 0; j < 2; j++) maxi(ans, val[i][j]); return ans; } }; vector<Node> pref[N], suf[N]; Node dp[N]; void dfs_init(int x, int p) { for (int y: adj[x]) { if (y == p) continue; g[x].emplace_back(y); dfs_init(y, x); } } void dfs(int x) { pref[x].resize(g[x].size()); suf[x].resize(g[x].size()); for (int y: g[x]) dfs(y); for (int i = 0, o = g[x].size(); i < o; i++) { int y = g[x][i]; auto &p = pref[x][i]; if (i) p.maxi_(pref[x][i - 1]); p.deal(dp[y], x, y); } for (int o = g[x].size(), i = o - 1; i >= 0; i--) { int y = g[x][i]; auto &p = suf[x][i]; if (i < o - 1) p.maxi_(suf[x][i + 1]); p.deal(dp[y], x, y); } if (!g[x].empty()) dp[x] = pref[x].back(); // else { maxi(dp[x].val[0][0], 0); if (k > 0) maxi(dp[x].val[1][1], s[x]); // } maxi(ans, dp[x].res()); } void dfs_reroot(int x, Node down) { maxi(down.val[0][0], 0); if (k > 0) maxi(down.val[1][1], s[x]); maxi(ans, down.res()); for (int i = 0, o = g[x].size(); i < o; i++) { int y = g[x][i]; Node cur = down; if (i > 0) cur.maxi_(pref[x][i - 1]); if (i + 1 < o) cur.maxi_(suf[x][i + 1]); dfs_reroot(y, cur.deal_(y, x)); } } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; adj[x].emplace_back(y); adj[y].emplace_back(x); } for (int x = 1; x <= n; x++) { for (int y: adj[x]) s[x] += a[y]; } dfs_init(1, 0); dfs(1); dfs_reroot(1, Node()); 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...