Submission #964086

#TimeUsernameProblemLanguageResultExecution timeMemory
964086maxFedorchukRace (IOI11_race)C++17
100 / 100
364 ms115376 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;

const long long MX=2e5+10;
const long long INF=1e18;

vector < pair < long long , long long > > mas[MX];
set < pair < long long , long long > > st[MX];
long long dep[MX],vid[MX],ans=INF,kk;

void DFS(long long zar,long long mun)
{
    st[zar].insert({vid[zar],dep[zar]});

    for(auto [nxt,ds]:mas[zar])
    {
        if(nxt==mun)
        {
            continue;
        }

        vid[nxt]=vid[zar]+ds;
        dep[nxt]=dep[zar]+1;
        DFS(nxt,zar);

        if(st[zar].size()<st[nxt].size())
        {
            swap(st[zar],st[nxt]);
        }

        for(auto [rz,gl]:st[nxt])
        {
            auto it=st[zar].lower_bound({(kk+2*vid[zar])-rz,0});

            if(it!=st[zar].end())
            {
                if((*it).first+rz==kk+2*vid[zar])
                {
                    ans=min(ans,gl+(*it).second-2*dep[zar]);
                }
            }
        }

        for(auto u:st[nxt])
        {
            st[zar].insert(u);
        }
    }
}

int best_path(int N, int K, int H[][2], int L[]) 
{
    kk=K;

    for(long long i=0;i<N-1;i++)
    {
        mas[H[i][0]].push_back({H[i][1],L[i]});
        mas[H[i][1]].push_back({H[i][0],L[i]});
    }

    vid[0]=0;
    dep[0]=0;
    DFS(0,0);

    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...