# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
128076 | Nordway | 경주 (Race) (IOI11_race) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define up_b upper_bound
#define low_b lower_bound
#define sz(x) (int)x.size()
#define all(v) v.begin(),v.end()
#define boost ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
typedef pair<ll,ll> pll;
const ll INF=1e18;
const int inf = 2e9;
const ld eps=1e-7;
const ld pi = acos(-1);
const int dx[4]={0,0 ,1,-1};
const int dy[4]={1,-1,0,0};
const int N=2e5+11;
const int M=1e6+11;
const int mod=1e9+7;
int sz[N],h[N],ans[N];
ll d[N];
map<ll,int>mn;
vector<pii>g[N];
void dfssz(int v,int p){
sz[v]=1;
h[v]=h[p]+1;
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to!=p){
d[to]=d[v]+g[v][i].y;
dfssz(to,v);
}
}
}
void add(int v,int p){
mn[d[v]]=min(mn[d[v]],h[v]);
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==p)continue;
add(to,v);
}
}
void clr(int v,int p){
mn[d[v]]=inf;
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==p)continue;
clr(to,v);
}
}
void upd(int u,int v){
ll val=k-d[u]+2*d[v];
ans[v]=min(ans[v],mn[val]+h[u]-2*h[v]);
}
void dfs_upd(int v,int p,int u){
upd(v,u);
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==p)continue;
dfs_upd(to,v,u);
}
}
void dfs(int v,int pr,bool cl){
int p=-1;
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==pr)continue;
if(p==-1)p=to;
if(sz[p]<sz[to])p=to;
}
ans[v]=inf;
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==pr||to==p)continue;
dfs(to,v,1);
ans[v]=min(ans[v],ans[to]);
}
if(p!=-1){
dfs(p,v,0);
ans[v]=min(ans[v],ans[p]);
}
for(int i=0;i<sz(g[v]);i++){
int to=g[v][i].x;
if(to==pr||to==p)continue;
dfs_upd(to,v,v);
add(to,v);
}
upd(v,v);
mn[d[v]]=min(mn[d[v]],h[v]);
if(cl){
clr(v,pr);
}
}
int best_path(int n,int k,int H[][],int l[]){
for(int i=0;i<n-1;i++){
int u=H[i][0],v=H[i][1],w=l[i];
g[u].pb(mp(v,w));
g[v].pb(mp(u,w));
}
dfssz(0,0);
for(int i=0;i<n;i++){
mn[d[i]]=inf;
}
dfs(0,0,0);
return mn[0];
}