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 <bits/stdc++.h>
#define ll long long
#define pb push_back
#define F first
#define S second
#define MP make_pair
#define pii pair<int,int>
#define vi vector<int>
#define all(x) x.begin(),x.end()
#define vvi vector<vector<int>>
#define loop(i,a,b) for(int i = a; i <= b; i++)
#define FOR(i, a, b) for(int i = a; i < b; i++)
#define _ ios::sync_with_stdio(false);cout.tie(NULL);cin.tie(NULL);
using namespace std;
const int OO = 1e9;
const int N = 2e5 + 5;
const int K = 1e6 + 5;
//best depth available for current weight
int curK, sz[N], best[K];
bool rem[N];
vector<pair<int,int>> adj[N];
void preSz(int u, int par)
{
sz[u] = 1;
for(auto e:adj[u])
{
if(e.F == par || rem[e.F])
continue;
preSz(e.F, u);
sz[u] += sz[e.F];
}
}
int getCen(int u, int par, int subSz)
{
int mxSz = subSz - sz[u];
int ret = -1;
for(auto e:adj[u])
{
if(e.F == par || rem[e.F])
continue;
ret = max(ret, getCen(e.F, u, subSz));
mxSz = max(mxSz, sz[e.F]);
}
if(mxSz <= subSz / 2)
ret = u;
return ret;
}
void update(int u, int par, int curD, int curW, bool add)
{
if(curW > curK)
return;
if(add)
best[curW] = min(best[curW], curD);
else
best[curW] = OO;
for(auto e:adj[u])
{
if(e.F == par || rem[e.F])
continue;
update(e.F, u, curD+1, curW + e.S, add);
}
}
int solve(int u, int par, int curD, int curW)
{
if(curW > curK)
return OO;
int ans = curD + best[curK - curW];
for(auto e:adj[u])
{
if(e.F == par || rem[e.F])
continue;
ans = min(ans, solve(e.F, u, curD+1, curW+e.S));
}
return ans;
}
int solveCen(int cen)
{
int ans = OO;
for(auto e:adj[cen])
{
if(rem[e.F])
continue;
update(e.F, cen, 1, e.S, true);
ans = min(ans, solve(e.F,cen,1,e.S));
}
return ans;
}
int decompose(int node)
{
preSz(node, 0);
int cen = getCen(node, 0, sz[node]);
int curAns = solveCen(cen);
update(cen, 0, 0, 0,false);
rem[cen] = true;
for(auto e:adj[node])
{
if(rem[e.F])
continue;
curAns = min(curAns, decompose(e.F));
}
return curAns;
}
int best_path(int n, int k, int h[][2], int l[])
{
curK = k;
for(int i=0; i<n-1; i++)
{
++h[i][0]; ++h[i][1];
adj[h[i][0]].pb({h[i][1], l[i]});
adj[h[i][1]].pb({h[i][0], l[i]});
}
for(int d=0; d<=k; d++)
best[d] = OO;
int ans = decompose(1);
if(ans >= OO)
ans = -1;
for(int i=1; i<=n; i++)
adj[i].clear();
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... |