This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200'005;
vector<pair<int, ll> > adj[N];
ll dx[N];
int px[N];
int py[N];
ll dy[N];
ll d[N];
int p[N];
void dfs(int v, int par) {
p[v] = par;
for(auto& u : adj[v]) {
if(u.first == par) continue;
d[u.first] = u.second + d[v];
dfs(u.first, v);
}
}
int max_score(int n, int X, int Y, long long k,
std::vector<int> U, std::vector<int> V, std::vector<int> W)
{
multiset<ll> q, w;
// q - solo, w - double
vector<pair<ll, ll> > help;
for(int i = 0; i < n; ++i){
d[i] = dx[i] = dy[i] = p[i] = px[i] = py[i] = 0;
adj[i].clear();
}
for(int i = 0; i < n - 1; ++i) {
adj[U[i]].push_back({V[i], W[i]});
adj[V[i]].push_back({U[i], W[i]});
}
dfs(X, -1);
swap(d, dx);
swap(p, px);
dfs(Y, -1);
swap(d, dy);
swap(p, py);
int res = 0;
vector<ll> dd(n);
for(int i = 0; i < n; ++i) dd[i] = min(dx[i], dy[i]);
sort(dd.begin(), dd.end());
ll tmp = k;
for(int i = 0; i < n; ++i) {
tmp -= dd[i];
if(tmp >= 0) res = i + 1;
else break;
}
int cur = 0;
ll sum = 0;
for(int i = 0; i < n; ++i) {
if(dx[i] + dy[i] == dx[Y]) {
sum += min(dx[i], dy[i]);
++cur;
q.insert(abs(dx[i] - dy[i]));
if(sum > k) return res;
} else {
help.push_back({min(dx[i], dy[i]), abs(dx[i] - dy[i])});
q.insert(min(dx[i], dy[i]));
}
}
sort(help.begin(), help.end(), [](const pair<ll, ll>& lhs, const pair<ll, ll>& rhs) {
return lhs.second == rhs.second ? lhs.first < rhs.first : lhs.second < rhs.second;
});
auto qit = q.begin();
auto wit = w.begin();
while(qit != q.end() && sum + *qit <= k) {
++cur;
sum += *qit;
++qit;
}
res = max(res, cur);
for(auto& e : help) {
e.second += e.first;
if(wit == w.end() || *wit > e.second) {
cur += 2;
sum += e.second;
}
w.insert(e.second);
auto fin = q.find(e.first);
if(qit == q.end() || *qit >= e.first) {
cur -= 1;
sum -= e.first;
}
if(qit == fin) {
cur += 1;
sum += e.first;
++qit;
}
q.erase(fin);
if(sum > k) {
--wit;
sum -= *wit;
cur -= 2;
}
bool reb;
if(qit != q.end() && sum + *qit <= k) {
sum += *qit;
cur += 1;
qit++;
}
if(wit != w.end() && sum + *wit <= k) {
sum += *wit;
cur += 2;
wit++;
reb = 1;
}
do {
reb = 0;
if(wit != w.end() && qit != q.begin()) {
auto q1 = qit;
q1--;
if(q1 != q.begin()){
auto q2 = q1;
q2--;
if(*q1 + *q2 > *wit) {
sum += *wit - *q1 - *q2;
++wit;
--qit;
--qit;
continue;
}
}
if(sum - *q1 + *wit <= k) {
sum += *wit - *q1;
++cur;
--qit;
++wit;
continue;
}
}
} while(reb);
res = max(res, cur);
}
return res;
}
# | 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... |