Submission #1361112

#TimeUsernameProblemLanguageResultExecution timeMemory
1361112ziyad_alharbiRace (IOI11_race)C++20
0 / 100
1 ms344 KiB
#include "race.h"
#include <bits/stdc++.h> 
using namespace std;
const int maxn=2e5+5;
const int maxk=1e6+5;
int dl[maxn],mn[maxk],d[maxn],k,cnt,sz[maxn],sm[maxn];
vector<array<int,2>>v[maxn];
void in(int x,int p)
{
    cnt++;
    sz[x]=1;
    for(auto [i,_]:v[x])
    {
        if(dl[i]||i==p)continue;
        in(i,x);
        sz[x]+=sz[i];
    }
}
int cn(int x,int p)
{
    for(auto [i,_]:v[x])
    {
        if(!dl[i]&&i!=p&&sz[i]>cnt/2)return cn(i,x);
    }
    return x;
}
void dfs1(int x,int p)
{
    for(auto [i,vl]:v[x])
    {
        if(dl[i]||i==p)continue;
        d[i]=d[x]+1;
        sm[i]=sm[x]+vl;
        dfs1(i,x);
    }
}
int dfs2(int x,int p)
{
    int s=-1;
     if(mn[k-sm[x]]!=1e9)s=(mn[k-sm[x]]+d[x]);
    for(auto [i,_]:v[x])
    {
        if(dl[i]||i==p||sm[i]>k)continue;
        int vl2=dfs2(i,x);
        // cout<<vl2<<' '<<s<<' '<<sm[x]<<' '<<mn[k-sm[i]]<<endl;
    }
    return s;
}
void dfs3(int x,int p)
{
    mn[sm[x]]=min(d[x],mn[sm[x]]);
    for(auto [i,_]:v[x])if(!dl[i]&&i!=p&&sm[i]<=k)dfs3(i,x);
}
int rt(int x)
{
    d[x]=mn[0]=sm[x]=0;
    dfs1(x,x);
    int rtr=-1;
    for(auto [j,_]:v[x])if(!dl[j])
    {
        int l=dfs2(j,x);
        dfs3(j,x);
        if(rtr==-1||(l<rtr&&l!=-1))rtr=l;
    }
    // cout<<x<<' '<<rtr<<endl;
    return rtr;
}
int dcomp(int x)
{
    cnt=0;
    for(int x=0;x<=k;x++)mn[x]=1e9;
    in(x,x);
    int i=cn(x,x);
    // cout<<x<<endl;
    int rtr=rt(i);
    dl[i]=1;
    for(auto [j,_]:v[i])if(!dl[j])
    {
        int l=dcomp(j);
        if(rtr==-1||(l<rtr&&l!=-1))rtr=l;
    }
    return rtr;
}
int best_path(int N, int K, int H[][2], int L[])
{
    k=K;
    for(int x=0;x<N-1;x++)
    {
        v[H[x][0]].push_back({H[x][1],L[x]});
        v[H[x][1]].push_back({H[x][0],L[x]});
    }
    return dcomp(0);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...