제출 #873962

#제출 시각아이디문제언어결과실행 시간메모리
873962CYhuang경주 (Race) (IOI11_race)C++17
100 / 100
241 ms45532 KiB
#include "race.h"
#include<bits/stdc++.h>
using namespace std;

#define For(i,a,b) for(int i=a;i<=b;i++)

typedef pair<int,int> pii;

typedef vector<int> vi;
#define pb push_back
const int Size=2e5;
const int Maxn=1e6;
const int INF=1<<20;
int ans;
int dp[Maxn+20],sz[Size+20],cnt[Maxn+20];
vector<pii> adj[Size+20];
bitset<Size+20> vis;
void dfs_sz(int u,int pa){
    sz[u]=1;
    for(auto [v,w]:adj[u]){
        if(v==pa||vis[v])   continue;
        dfs_sz(v,u);
        sz[u]+=sz[v];
    }
}
int dfs_cen(int u,int pa,int tot_sz){
    for(auto [v,w]:adj[u]){
        if(v==pa||vis[v])   continue;
        if(sz[v]>(tot_sz>>1))   return dfs_cen(v,u,tot_sz);
    }
    return u;
}
void get_path(int u,int pa,int len,int dep,vi &vec,int K){
    if(len>K)   return ;
    cnt[len]=min(cnt[len],dep);
    ans=min(ans,dp[K-len]+cnt[len]);
    vec.pb(len);
    for(auto [v,w]:adj[u]){
        if(v==pa||vis[v])   continue;
        get_path(v,u,len+w,dep+1,vec,K);
    }
}
void c_d(int rt,int K){
    dfs_sz(rt,rt);
    int centroid=dfs_cen(rt,rt,sz[rt]);
    vis[centroid]=true;
    vi vec;
    for(auto [v,w]:adj[centroid]){
        if(vis[v])  continue;
        vi vec2;
        get_path(v,centroid,w,1,vec2,K);
        for(auto i:vec2){
            dp[i]=min(dp[i],cnt[i]);
            vec.pb(i);
        }
        for(auto i:vec2)    cnt[i]=INF;
    }
    for(auto i:vec) dp[i]=INF;
    for(auto [v,w]:adj[centroid]){
        if(vis[v])  continue;
        c_d(v,K);
    }
}
int best_path(int N, int K, int H[][2], int L[])
{
    For(i,0,N-2){
        int u=H[i][0],v=H[i][1],w=L[i];
        u++,v++;
        adj[u].pb({v,w});
        adj[v].pb({u,w});
    }
    ans=INF;
    For(i,1,K)  dp[i]=cnt[i]=INF;
    c_d(1,K);
    return (ans==INF?-1:ans);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...