이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 nn, int kk, int h[][2], int l[])
{
curK = kk;
for(int i=0; i<nn-1; i++)
{
adj[h[i][0]+1].pb({h[i][1]+1, l[i]});
adj[h[i][1]+1].pb({h[i][0]+1, 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<=nn; i++)
adj[i].clear();
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:122:17: warning: iteration 1000005 invokes undefined behavior [-Waggressive-loop-optimizations]
122 | best[d] = OO;
| ~~~~~~~~^~~~
race.cpp:121:19: note: within this loop
121 | for(int d=0; d<=K; d++)
| ~^~~| # | 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... |