Submission #64956

#TimeUsernameProblemLanguageResultExecution timeMemory
64956PeppaPigRace (IOI11_race)C++14
100 / 100
1585 ms119076 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int, int>
#define x first
#define y second

const int N = 2e5+5;

int n, k;
int dep[N], pos[N], in[N], out[N], sz[N];
long d[N];
vector<pii> g[N];

void get_sz(int u, int p) {
    static int idx = 0;
    in[u] = ++idx, pos[idx] = u, sz[u] = 1;
    if(u) for(auto it = g[u].begin();;++it) if(it->x == p) {
        g[u].erase(it); break;
    }
    for(pii &v : g[u]) {
        d[v.x] = d[u] + v.y;
        dep[v.x] = dep[u] + 1;
        get_sz(v.x, u), sz[u] += sz[v.x];
        if(sz[g[u][0].x] < sz[v.x]) swap(v, g[u][0]);
    }
    out[u] = idx;
}

int ans = 1e9;
map<long, int> M;

void setMap(int u) {
    if(M[d[u]] == 0) M[d[u]] = dep[u];
    else M[d[u]] = min(M[d[u]], dep[u]);
}

void getVal(int u, int lca) {
    long val = k - d[u] + 2*d[lca];
    int ret = M[val];
    if(ret != 0) {
        int z = ret + dep[u] - 2 * dep[lca];
        ans = min(ans, z);
    }
}

void solve(int u, bool keep) {
    for(pii v : g[u]) if(v != g[u][0]) solve(v.x, false);
    if(g[u].size()) solve(g[u][0].x, true);
    getVal(u, u), setMap(u);
    for(pii v : g[u]) if(v != g[u][0]) {
        for(int i = in[v.x]; i <= out[v.x]; ++i) getVal(pos[i], u);
        for(int i = in[v.x]; i <= out[v.x]; ++i) setMap(pos[i]);
    }
    if(!keep) M.clear();
}

int best_path(int N, int K, int H[][2], int L[]) {
    k= K;
    for(int i = 0; i < N-1; ++i) {
        g[H[i][0]].emplace_back(H[i][1], L[i]);
        g[H[i][1]].emplace_back(H[i][0], L[i]);
    } 
    dep[0] = 1;
    get_sz(0, -1);
    solve(0, false);
    return (ans == (int)1e9 ? -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...