Submission #1268237

#TimeUsernameProblemLanguageResultExecution timeMemory
1268237wedkaRace (IOI11_race)C++20
0 / 100
7 ms14408 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxN = 2e5+5;
ll INF = 1e12;
ll sum[maxN];
ll depth[maxN];
vector<vector<pair<ll,ll>>> adj(maxN);
vector<map<ll,ll>> mp(maxN);
ll k,n;
ll ans = INF;

void dfs(int s, int p) {
    depth[s] = depth[p]+1;
    if(sum[s] <= 3e6) {
        if(mp[s][sum[s]] == 0) mp[s][sum[s]] = depth[s];
        else mp[s][sum[s]] = min(mp[s][sum[s]], depth[s]);
    }
    for(auto ps : adj[s]) {
        int w = ps.first, u = ps.second;
        if(u == p) continue;
        sum[u] = sum[s]+w;
        dfs(u,s);
        if(mp[u].size() > mp[s].size()) swap(mp[u],mp[s]);
        for(auto pr : mp[u]) {
            int cur = mp[s][k-pr.first + 2*sum[s]];
            if(cur != 0) {
                ans = min(ans,cur+pr.second - 2*depth[s]);
            }
        }
        for(auto pr : mp[u]) {
            mp[s].insert(pr);

        }
    }
}

int best_path(int N, int K, int H[][2], int L[]) {
    n = N;
    k = K;
    for(int i = 0; i < N-1; i++) {
        int a = H[i][0],b = H[i][1], w = L[i];
        adj[a].push_back({w,b});
        adj[b].push_back({w,a});
    }
    sum[0] = 0;
    depth[0] = -1;
    dfs(0,0);
    if(ans == INF) return -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...