#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define ALL(a) a.begin(), a.end()
#define ll long long
#define MP make_pair
#define pii pair<int, int>
const ll INF = 1ll << 50;
int none(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
vector<vector<pii>> adj(N);
for (int i=0; i < N-1; i++) {
adj[V[i]].eb(U[i], W[i]);
adj[U[i]].eb(V[i], W[i]);
}
vector<bool> done(N);
vector<ll> d(N, INF);
d[X] = d[Y] = 0;
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.emplace(0, X);
pq.emplace(0, Y);
int ans = 0;
while (!pq.empty()) {
auto [_, v] = pq.top();
pq.pop();
if (done[v]) continue;
done[v] = true;
if (d[v] <= K) {
ans++;
K -= d[v];
}
for (auto [u, w] : adj[v]) if (d[v]+w < d[u]) {
d[u] = d[v]+w;
pq.push(MP(d[u], u));
}
}
return ans;
}
int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
vector<vector<pii>> adj(N);
for (int i=0; i < N-1; i++) {
adj[V[i]].eb(U[i], W[i]);
adj[U[i]].eb(V[i], W[i]);
}
vector<array<ll, 2>> f(N);
auto dfs = [&](auto self, int v, int p, int c) -> void {
for (auto [u, w] : adj[v]) if (u!=p) {
f[u][c] = f[v][c] + w;
self(self, u, v, c);
}
};
dfs(dfs, X, X, 0);
dfs(dfs, Y, Y, 1);
vector<int> save_L, save_R;
for (int i=0; i<N; i++) (f[i][0]<=f[i][1] ? save_L : save_R).pb(i);
sort(ALL(save_L), [&](int v, int u) {
return f[v][1]>f[u][1];
});
sort(ALL(save_R), [&](int v, int u) {
return f[v][0]>f[u][0];
});
vector<int> save_by_x(N), save_by_y(N);
iota(ALL(save_by_x), 0);
iota(ALL(save_by_y), 0);
sort(ALL(save_by_x), [&](int v, int u) {
return f[v][0]>f[u][0];
});
sort(ALL(save_by_y), [&](int v, int u) {
return f[v][1]>f[u][1];
});
int ans = none(N, X, Y, K, U, V, W);
for (int m=1; m<=N; m++) {
vector<int> L = save_L;
vector<int> R = save_R;
vector<ll> c(N, -1);
ll k = K;
for (int _=0; _<m; _++) {
bool flg = false;
if (!L.empty() && !R.empty()) {
int v = L.back();
int u = R.back();
if (f[v][1]<f[u][0]) flg = true;
}
if (R.empty() || flg) {
int v = L.back();
L.pop_back();
k -= c[v] = f[v][1];
}
else {
int v = R.back();
R.pop_back();
k -= c[v] = f[v][0];
}
}
if (k<0) continue;
int res = 0;
vector<int> by_x = save_by_x;
vector<int> by_y = save_by_y;
while (!by_x.empty() || !by_y.empty()) {
bool flg = false;
if (!by_x.empty() && !by_y.empty()) {
int v = by_x.back();
int u = by_y.back();
if (f[v][0]<f[u][1]) flg = true;
}
if (by_y.empty() || flg) {
int v = by_x.back();
by_x.pop_back();
if (c[v] != -1 || f[v][0]<=k) {
res++;
if (c[v] != -1) k -= f[v][0];
}
else break;
}
else {
int v = by_y.back();
by_y.pop_back();
if (c[v] != -1 || f[v][1]<=k) {
res++;
if (c[v] != -1) k -= f[v][1];
}
else break;
}
}
ans = max(ans, res);
}
return ans;
}
# | 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... |