Submission #1131579

#TimeUsernameProblemLanguageResultExecution timeMemory
1131579LuvidiRace (IOI11_race)C++20
100 / 100
704 ms171120 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;

const int maxn=2e5;
vector<pair<long long,int>> adj[maxn];
int ans,dp[maxn],sz[maxn],k;
map<long long,int> m[maxn];
long long ds[maxn];

void dfs1(int v,int p){
    for(auto[u,w]:adj[v])if(u!=p){
        dp[u]=dp[v]+1;
        ds[u]=ds[v]+w;
        dfs1(u,v);
    }
}

void dfs2(int v,int p){
    int x=-1;
    for(auto[u,w]:adj[v])if(u!=p){
        if(x==-1||sz[u]>sz[x])x=u;
    }
    if(x!=-1){
        dfs2(x,v);
        swap(m[v],m[x]);
        for(auto[u,w]:adj[v])if(u!=p&&u!=x){
            dfs2(u,v);
            for(auto[x,y]:m[u]){
                if(m[v].count(k+2*ds[v]-x))ans=min(ans,m[v][k+2*ds[v]-x]+y-2*dp[v]);
            }
            for(auto[x,y]:m[u]){
                if(!m[v].count(x))m[v][x]=y;
                m[v][x]=min(m[v][x],y);
            }
        }
    }
    if(m[v].count(k+ds[v]))ans=min(ans,m[v][k+ds[v]]-dp[v]);
    if(!m[v].count(ds[v]))m[v][ds[v]]=dp[v];
    m[v][ds[v]]=min(m[v][ds[v]],dp[v]);
}

int best_path(int n, int K, int h[][2], int l[])
{    
    k=K;
    for(int i=0;i<n-1;i++){
        adj[h[i][0]].push_back({h[i][1],l[i]});
        adj[h[i][1]].push_back({h[i][0],l[i]});
    }
    ans=1e9;
    dfs1(0,0);
    dfs2(0,0);
    if(ans==1e9)ans=-1;
    return 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...