Submission #571751

#TimeUsernameProblemLanguageResultExecution timeMemory
571751piOOEChase (CEOI17_chase)C++17
0 / 100
4051 ms11912 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; vector<int> g[N]; int n, k, parent[N], depth[N]; ll p[N], pp[N]; void dfs(int v) { for (int to: g[v]) { if (to != parent[v]) { parent[to] = v; depth[to] = depth[v] + 1; dfs(to); } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> p[i]; } 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); } ll ans = 0; for (int r = 0; r < n; ++r) { parent[r] = -1; depth[r] = 1; dfs(r); for (int v = 0; v < n; ++v) { vector<int> now; { int x = v; while (x != -1) { now.push_back(x); x = parent[x]; } } assert(sz(now) == depth[v]); for (int mask = 0; mask < (1 << depth[v]); ++mask) { if (__builtin_popcount(mask) <= k) { ll jerry = 0, tom = 0; memcpy(pp, p, sizeof(pp[0]) * n); for (int i = 0; i < sz(now); ++i) { jerry += pp[now[i]]; if (mask & 1 << k) { for (int to: g[now[i]]) { pp[now[i]] += pp[to]; pp[to] = 0; } } } for (int x : now) tom += pp[x]; ans = max(ans, tom - jerry); } } } } 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...