Submission #43258

#TimeUsernameProblemLanguageResultExecution timeMemory
43258krauchChase (CEOI17_chase)C++14
100 / 100
1521 ms361632 KiB
/* _ _ _______ _ _ | | / / | _____| | | / / | | / / | | | | / / | |/ / | |_____ | |/ / | |\ \ | _____| | |\ \ | | \ \ | | | | \ \ | | \ \ | |_____ | | \ \ |_| \_\ |_______| |_| \_\ */ #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; typedef double ld; typedef pair <int, int> PII; typedef pair <ll, ll> PLL; typedef pair < ll, int > PLI; #define F first #define S second #define pb push_back #define eb emplace_back #define right(x) x << 1 | 1 #define left(x) x << 1 #define forn(x, a, b) for (int x = a; x <= b; ++x) #define for1(x, a, b) for (int x = a; x >= b; --x) #define mkp make_pair #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define y1 kekekek #define fname "" const ll ool = 1e18 + 9; const int oo = 1e9 + 9, base = 1e9 + 7; const ld eps = 1e-7; const int N = 1e5 + 6, M = 111; int n, K; ll res[N][2], dd[N][M][2], du[N][M][2], mx[M][2], p[N], ans; vector < int > g[N]; void dfs(int v, int par) { ll sum = 0; for (auto to : g[v]) { if (to == par) continue; dfs(to, v); sum += p[to]; } forn(i, 0, K + 1) forn(j, 0, 1) du[v][i][j] = dd[v][i][j] = res[v][j] = mx[i][j] = 0; mx[0][1] = -ool; for (auto to : g[v]) { if (to == par) continue; forn(i, 0, K) { res[v][0] = max(res[v][0], max(du[to][i][0], du[to][i][1] + p[v]) + max(mx[K - i][0], mx[K - i][1])); if (i < K) res[v][1] = max(res[v][1], max(du[to][i][0], du[to][i][1] + p[v]) + sum - p[to] + max(mx[K - i - 1][0], mx[K - i - 1][1])); du[v][i][0] = max(du[v][i][0], max(du[to][i][0], du[to][i][1] + p[v])); du[v][i + 1][1] = max(du[v][i + 1][1], max(du[to][i][0], du[to][i][1] + p[v]) + sum - p[to]); dd[v][i][0] = max(dd[v][i][0], max(dd[to][i][0], dd[to][i][1])); dd[v][i + 1][1] = max(dd[v][i + 1][1], max(dd[to][i][0], dd[to][i][1]) + sum); } forn(i, 0, K) { mx[i][0] = max(mx[i][0], dd[to][i][0]); mx[i][1] = max(mx[i][1], dd[to][i][1]); } } du[v][0][1] = -ool; dd[v][0][1] = -ool; du[v][1][1] = max(du[v][1][1], sum); dd[v][1][1] = max(dd[v][1][1], sum); res[v][1] = max(res[v][1], sum); forn(i, 1, K) { du[v][i][0] = max(du[v][i][0], du[v][i - 1][0]); du[v][i][1] = max(du[v][i][1], du[v][i - 1][1]); dd[v][i][0] = max(dd[v][i][0], dd[v][i - 1][0]); dd[v][i][1] = max(dd[v][i][1], dd[v][i - 1][1]); } ans = max(ans, max(res[v][0], res[v][1] + p[par])); ans = max(ans, max(du[v][K][0], du[v][K][1] + p[par])); ans = max(ans, max(dd[v][K][0], dd[v][K][1] + p[par])); } int main() { ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #ifdef krauch freopen("input.txt", "r", stdin); #else //freopen(fname".in", "r", stdin); //freopen(fname".out", "w", stdout); #endif cin >> n >> K; forn(i, 1, n) { cin >> p[i]; } forn(i, 1, n - 1) { int x, y; cin >> x >> y; g[x].eb(y); g[y].eb(x); } if (!K) { cout << "0\n"; return 0; } dfs(1, 0); forn(i, 1, n) reverse(all(g[i])); dfs(1, 0); cout << ans << "\n"; 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...