Submission #1342714

#TimeUsernameProblemLanguageResultExecution timeMemory
1342714vjudge1Race (IOI11_race)C++20
100 / 100
1144 ms34864 KiB
#include "race.h"
#include<bits/stdc++.h>
using namespace std;
const int N =200100;
vector<pair<int,int>>adj[N];
int KIL[N],k,ans=1e9,sz[N],rt;
map<int,int> STF;
void dfs1(int n,int p,int tot){
    sz[n]=1;
    int mx=0;
    for(auto[a,_]:adj[n]) if(!KIL[a]&&a-p)
        dfs1(a,n,tot),sz[n]+=sz[a],mx=max(mx,sz[a]);
    mx=max(mx,tot-sz[n]);
    if(mx<=tot/2)
        rt=n;
}
void dfs2(int n,int p,int d1,int d2){
    if(d1>k)return;
    if(STF.count(k-d1))
        ans=min(ans,STF[k-d1]+d2);
    for(auto [x,y]:adj[n])
        if(x-p&&!KIL[x])
            dfs2(x,n,d1+y,d2+1);
}
void dfs3(int n,int p,int d1,int d2){
    if(d1>k)return;
    if(STF.count(d1))
        STF[d1]=min(STF[d1],d2);
    else STF[d1]=d2;
    for(auto [x,y]:adj[n])
        if(x-p&&!KIL[x])
            dfs3(x,n,d1+y,d2+1);
}
void decomp(int n,int tot){
    dfs1(n,0,tot);
    STF.clear();
    STF[0]=0;
    n=rt;
    dfs1(n,0,tot);
    KIL[n]=1;
    for(auto[a,b]:adj[n])if(!KIL[a]) 
        dfs2(a,n,b,1),dfs3(a,n,b,1);
    for(auto [k,_]:adj[n])
        if(!KIL[k])
            decomp(k,sz[k]);
}
void AE(int a,int b,int k){
    adj[a].push_back({b,k});
    adj[b].push_back({a,k});
}
int best_path(int N, int K, int H[][2], int L[]){
    for(int i=0;i<N-1;i++)
        AE(H[i][0],H[i][1],L[i]);
    k=K;
    decomp(1,N);
    return (ans>N?-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...