#include "closing.h"
#include <bits/stdc++.h>
#define maxn 200005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int n, x, y; int64_t k;
int64_t dp[2005][4005];
int64_t disX[2005], disY[2005];
int64_t cost_level_one[2005], cost_level_two[2005];
vector<ii> adj[2005];
void calcdisX() {
function<void(int, int)> dfs = [&](int u, int dad) {
for (auto [v, l] : adj[u])
if (v != dad) {
disX[v] = disX[u] + l;
dfs(v, u);
}
};
disX[x] = 0;
dfs(x, -1);
}
void calcdisY() {
function<void(int, int)> dfs = [&](int u, int dad) {
for (auto [v, l] : adj[u])
if (v != dad) {
disY[v] = disY[u] + l;
dfs(v, u);
}
};
disY[y] = 0;
dfs(y, -1);
}
int sub1() {
vector<int64_t> nho;
for (int i = 0; i < n; i++) nho.emplace_back(min(disX[i], disY[i]));
sort(nho.begin(), nho.end());
int64_t ans = 0;
for (int i = 0; i < n; i++) {
ans += nho[i];
if (ans > k) return i;
}
return n;
}
int sub2() {
for (int i = 0; i < n; i++) {
cost_level_two[i] = max(disX[i], disY[i]);
cost_level_one[i] = min(disX[i], disY[i]);
}
int64_t sum = 0; int cnt = 0;
for (int i = 0; i < n; i++)
if (disX[i] + disY[i] == disX[y]) {
sum += cost_level_one[i];
++cnt;
}
for (int i = 0; i <= 2*n; i++) dp[n][i] = LLONG_MAX/2;
dp[n][cnt] = sum;
for (int i = n-1; i >= 0; i--) {
for (int j = 0; j <= 2*n; j++) dp[i][j] = dp[i+1][j];
if (disX[i] + disY[i] == disX[y]) {
for (int j = 0; j <= 2*n; j++)
if (j+1 <= 2*n) dp[i][j+1] = min(dp[i][j+1], dp[i+1][j] + cost_level_two[i] - cost_level_one[i]);
continue;
}
for (int j = 0; j <= 2*n; j++) {
if (j+1 <= 2*n) dp[i][j+1] = min(dp[i][j+1], dp[i+1][j] + cost_level_one[i]);
if (j+2 <= 2*n) dp[i][j+2] = min(dp[i][j+2], dp[i+1][j] + cost_level_two[i]);
}
}
int ans = 0;
for (int i = 0; i <= 2*n; i++) if (dp[0][i] <= k) ans = i;
return ans;
}
int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) {
n = N; x = X; y = Y; k = K;
for (int i = 0; i < N-1; i++) {
adj[U[i]].emplace_back(V[i], W[i]);
adj[V[i]].emplace_back(U[i], W[i]);
}
calcdisX(); calcdisY();
int ans = max(sub1(), sub2());
for (int i = 0; i < N; i++) adj[i].clear();
for (int i = 0; i <= N; i++) for (int j = 0; j <= 2*N; j++) dp[i][j] = 0;
return ans;
}
/*
2
7 0 2 10
0 1 2
0 3 3
1 2 4
2 4 2
2 5 5
5 6 3
4 0 3 20
0 1 18
1 2 1
2 3 19
*/
/*
1
4 0 3 20
0 1 18
1 2 1
2 3 19
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |