Submission #60810

#TimeUsernameProblemLanguageResultExecution timeMemory
60810theknife2001Race (IOI11_race)C++17
43 / 100
3019 ms115196 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;
const int M=2e5+55;
vector < pair < int , int > > vec[M];
int k[M][105];
int b=1e9+55;

void dfs(int u , int p , int K)
{
    int v,c;
    int temp;
    for(auto x:vec[u])
    {
        v=x.first;
        c=x.second;
        if(v==p)
            continue ;
        dfs(v,u,K);
        for(int i=0;i<=K-c;i++)
            b=min(b,k[v][i]+k[u][K-i-c]+1);
        for(int i=0;i<=K-c;i++)
        {
            temp=k[v][i];
            k[u][i+c]=min(k[u][i+c],temp+1);
        }
    }
    b=min(b,k[u][K]);
}

void df(int u , int p , int cnt , int c , int k)
{
    if(cnt==k)
    {
        b=min(b,c);
        return ;
    }
    if(cnt>k)
        return ;
    int v,x;
    for(auto a:vec[u])
    {
        v=a.first;
        x=a.second;
        if(v==p)
            continue ;
        df(v,u,cnt+x,c+1,k);
    }
}

int best_path(int n, int K, int H[][2], int L[])
{
    for(int i=0;i<n-1;i++)
    {
        vec[H[i][0]].push_back({H[i][1],L[i]});
        vec[H[i][1]].push_back({H[i][0],L[i]});
    }
    if(K>100)
    {
        b=1e9+55;
        for(int i=0;i<n;i++)
        {
            df(i,-1,0,0,K);
        }
        if(b==1e9+55)
            return -1;
        return b;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=1;j<=K;j++)
            k[i][j]=1e9+55;
    }
    dfs(0,-1,K);
    return (b==1e9+55?-1:b);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...