#include "closing.h"
#include<bits/stdc++.h>
#define f0r(i,n) for(ll i = 0;i<n;i++)
#define FOR(i, k, n) for(int i = k;i<n;i++)
#define pb push_back
#define vi vector<long long int>
#define ll long long int
using namespace std;
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<pair<ll,ll>> adj[N];
f0r(i, N-1){
adj[U[i]].pb({V[i], W[i]});
adj[V[i]].pb({U[i], W[i]});
}
vector<vector<ll>>dist(N, vector<ll>(2, 4e18));
vector<bool>vis(N, 0);
queue<int>q;
q.push(X);
vis[X] = 1;
dist[X][0] = 0;
while(!q.empty()){
int c = q.front();
q.pop();
for(auto u : adj[c]){
if(vis[u.first])continue;
vis[u.first] = 1;
dist[u.first][0] = min(dist[u.first][0], dist[c][0] + u.second);
q.push(u.first);
}
}
f0r(i,N)vis[i] = 0;
vis[Y] = 1;
dist[Y][1] = 0;
q.push(Y);
while(!q.empty()){
int c = q.front();
q.pop();
for(auto u : adj[c]){
if(vis[u.first])continue;
vis[u.first] = 1;
dist[u.first][1] = min(dist[u.first][1], dist[c][1] + u.second);
q.push(u.first);
}
}
if(dist[Y][0] > 2 * K){
vector<ll> dists;
f0r(i, N){
dists.pb(min(dist[i][0], dist[i][1]));
}
sort(dists.begin(), dists.end());
int ans = 0;
ll s = 0;
f0r(i, N){
if(s + dists[i] > K)break;
ans++;
s += dists[i];
}
return ans;
}
else{
vector<ll> dists;
f0r(i, N){
dists.pb(min(dist[i][0], dist[i][1]));
}
sort(dists.begin(), dists.end());
ll ans = 0;
ll s = 0;
f0r(i, N){
if(s + dists[i] > K)break;
ans++;
s += dists[i];
}
vi psl;
psl.pb(0);
ll cur = 0;
for(int i = X-1; i>=0; i--){
cur += dist[i][0];
psl.pb(cur);
}
vi psr; psr.pb(0);
cur = 0;
for(int i = Y+1; i<N; i++){
cur += dist[i][1];
psr.pb(cur);
}
vi l2(N+1);
FOR(i, 1, N+1){
l2[i] = l2[i-1] + max(dist[i-1][0], dist[i-1][1]);
}
f0r(i, N){
for(ll j = i; j<N; j++){
if(j < X)continue;
if(i > Y)continue;
ll cur = l2[j+1] - l2[i];
/*
if(i == 1 && j == 2){
cout<<cur<<'\n';
}
*/
if(cur > K)continue;
ll x = i;
ll y = j;
ll c = 0;
vi thing;
for(ll i = x-1; i>=0; i--){
c += dist[i][0];
thing.pb(c);
}
c = 0;
for(ll i = y+1; i<N; i++){
c += dist[i][1];
thing.pb(c);
}
sort(thing.begin(), thing.end());
//last one such that fits
ll res = K - cur;
ll lo = -1;
ll hi = thing.size() - 1;
while(lo < hi){
int mid = lo + (hi - lo + 1) / 2;
if(thing[mid] <= res){
lo = mid;
}
else{
hi = mid - 1;
}
}
ans = max(ans, 2 * (j - i + 1) + lo + 1);
}
}
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... |