#include "closing.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
typedef long long ll;
namespace{
vector<vector<pair<int, ll>>> graph;
int n;
ll k;
int sz;
int a, b;
vector<pair<ll, ll>> dists;
vector<int> p, vec, szs, inp;
vector<vector<ll>> cost, rc;
void dfs1(int node, int parent, int day){
p[node] = parent;
for(auto &[x, l]: graph[node]){
if(x == parent) continue;
if(day == 0) dists[x].first = dists[node].first + l;
else dists[x].second = dists[node].second + l;
dfs1(x, node, day);
}
}
void dfs2(int node, int parent, int rt){
for(auto &[x, l]: graph[node]){
if(x == parent) continue;
if(inp[x]) continue;
cost[rt].push_back(dists[x].first);
dfs2(x, node, rt);
}
}
}
int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W){
n = N;
k = K;
a = X + 1;
b = Y + 1;
vector<vector<pair<int, ll>>>().swap(graph);
vector<pair<ll, ll>>().swap(dists);
vector<int>().swap(p);
vector<int>().swap(vec);
vector<int>().swap(szs);
vector<int>().swap(inp);
vector<vector<ll>>().swap(cost);
vector<vector<ll>>().swap(rc);
graph.resize(n + 1);
dists.resize(n + 1);
p.resize(n + 1);
inp.resize(n + 1);
for(int i = 0; i < n - 1; i++){
graph[U[i] + 1].emplace_back(V[i] + 1, W[i]);
graph[V[i] + 1].emplace_back(U[i] + 1, W[i]);
}
dfs1(a, a, 0);
int cur = b;
while(cur != a){
vec.push_back(cur);
cur = p[cur];
}
vec.push_back(a);
vec.push_back(0);
reverse(vec.begin(), vec.end());
sz = (int)vec.size() - 1;
szs.resize(sz + 1);
cost.resize(sz + 1);
rc.resize(sz + 1);
dfs1(b, b, 1);
for(int i = 1; i <= n; i++){
if(dists[i].first > dists[i].second) swap(dists[i].first, dists[i].second);
}
for(int i = 1; i <= sz; i++) inp[vec[i]] = 1;
for(int i = 1; i <= sz; i++){
cost[i].push_back(0);
dfs2(vec[i], vec[i], i);
szs[i] = (int)cost[i].size() - 1;
sort(cost[i].begin(), cost[i].end());
ll diff = dists[vec[i]].second - dists[vec[i]].first;
rc[i].resize(2 * szs[i] + 1);
int ptr = 0;
while(ptr < szs[i] && cost[i][ptr + 1] <= diff){
ptr++;
rc[i][ptr] = rc[i][ptr - 1] + cost[i][ptr];
}
for(int j = 1; j <= ptr; j++) rc[i][ptr + j] = rc[i][ptr + j - 1] + diff;
for(int j = ptr + 1; j <= szs[i]; j++){
rc[i][2 * j - 1] = rc[i][2 * j - 2] + cost[i][j];
rc[i][2 * j] = rc[i][2 * j - 1] + diff;
}
}
vector<ll> pa(sz + 1), pb(sz + 1);
for(int i = 1; i <= sz; i++){
pa[i] = pa[i - 1] + dists[vec[i]].first;
pb[i] = pb[i - 1] + dists[vec[i]].second - dists[vec[i]].first;
}
if(dists[b].second > 2 * k){
vector<ll> tmp;
for(int i = 1; i <= n; i++) tmp.push_back(dists[i].first);
sort(tmp.begin(), tmp.end());
ll sum = 0;
for(int i = 0; i < n; i++){
sum += tmp[i];
if(sum > k) return i;
}
return n;
}
return 0;
}
# | 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... |