Submission #1131093

#TimeUsernameProblemLanguageResultExecution timeMemory
1131093a5a7Race (IOI11_race)C++20
100 / 100
519 ms98296 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int best_path(int N, int K, int H[][2], int L[]){
    map<ll,int> m[N];
    vector<vector<pair<int,int>>> adj(N);
    for (int i = 1; i < N; i++){
        adj[H[i-1][0]].push_back({H[i-1][1], L[i-1]});
        adj[H[i-1][1]].push_back({H[i-1][0], L[i-1]});
    }
    ll dist = 0;
    int best = N+1;
    int depth = 0;
    function<void(int,int)> dfs = [&](int x, int prev){
        m[x][dist] = depth;
        depth++;
        for (auto nxt : adj[x]){
            if (nxt.first == prev) continue;
            dist += nxt.second;
            dfs(nxt.first, x);
            dist -= nxt.second;
            if (m[x].size()<m[nxt.first].size()) m[x].swap(m[nxt.first]);
            for (auto y : m[nxt.first]){
                if (!m[x].count(K+2*dist-y.first)) continue;
                best = min(best, m[x][K+2*dist-y.first]+y.second-2*depth+2);
            }
            for (auto y : m[nxt.first]){
                if (m[x].count(y.first)){
                    m[x][y.first] = min(m[x][y.first], y.second);
                }else{
                    m[x][y.first] = y.second;
                }
            }
        }
        depth--;
    };
    dfs(0, -1);
    if (best == (N+1)) best = -1;
    return best;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...