#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);
    int ret = none(N, X, Y, K, U, V, W);
    for (int l=0; l<N; l++) {
        ll sum_mx = 0;
        for (int r=l; r<N; r++) {
            sum_mx += max(f[r][0], f[r][1]);
            
            vector<int> L, R;
            for (int v=0; v<l && v<X; v++) L.pb(v);
            for (int v = N-1; r<v && Y<v; v--) R.pb(v);
        
            ll rem_k = K - sum_mx;
            for (int v=X; v<l; v++) rem_k -= f[v][0];
            for (int v=Y; r<v; v--) rem_k -= f[v][1];
            if (rem_k<0) continue;
            
            int ans = 2 * (r-l+1);
            if (X<l) ans += l-X;
            if (r<Y) ans += Y-r;
            while (!L.empty() || !R.empty()) {
                bool flg = false;
                if (!L.empty() && !R.empty()) {
                    int v = L.back();
                    int u = R.back();
                    if (f[v][0]<f[u][1]) flg = true;
                }
                if (R.empty() || flg) {
                    int v = L.back();
                    L.pop_back();
                    if (f[v][0]<=rem_k) rem_k -= f[v][0], ans++;
                }
                else {
                    int v = R.back();
                    R.pop_back();
                    if (f[v][1]<=rem_k) rem_k -= f[v][1], ans++;
                }
            }
            ret = max(ret, ans);
        }
    }
    return ret;
}
| # | 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... |