제출 #848322

#제출 시각아이디문제언어결과실행 시간메모리
848322victor_gao경주 (Race) (IOI11_race)C++17
100 / 100
324 ms66136 KiB
#include "race.h"
#include <bits/stdc++.h>
#define pii pair<int, int>
#define x first
#define y second
#define MAXN 200015
#define MAXC 1000005
using namespace std;
int sz[MAXN], dep[MAXN], mx[MAXN], use[MAXN];
int ans = 2e9, t = 0, k, in[MAXN], out[MAXN], tag = 0;
vector<pii> g[MAXN];
vector<int> path;
multiset<pii> st;
void dfs(int p, int lp) {
    sz[p] = 1;
    mx[p] = -1;
    path.push_back(p);
    in[p] = t++;
    for (auto [i, c] : g[p]) {
        if (i != lp) {
            dep[i] = dep[p] + c;
            use[i] = use[p] + 1;
            dfs(i, p);
            sz[p] += sz[i];
            mx[p] = (mx[p] == -1 || sz[mx[p]] < sz[i]) ? i : mx[p];
        }
    }
    out[p] = t;
}
int query(int p, int i) {
    if (st.empty())
        return 2e9;
    int need = k + 2 * dep[p] - dep[i];
    auto it = st.lower_bound(pii(need, -1));
    if (it != st.end() && (it->x) == need)
        return it->y;
    return 2e9;
}
void dfs1(int p, int lp, bool flag) {
    for (auto [i, c] : g[p]) {
        if (i != lp && i != mx[p])
            dfs1(i, p, 0);
    }
    if (mx[p] >= 0)
        dfs1(mx[p], p, 1);
    for (auto [i, c] : g[p]) {
        if (i != lp && i != mx[p]) {
            for (int j = in[i]; j < out[i]; j++) {
                int a = path[j];
                ans = min(ans, use[a] + query(p, a) - 2 * use[p]);
            }
            for (int j = in[i]; j < out[i]; j++) {
                int a = path[j];
                st.insert(pii(dep[a], use[a]));
            }
        }
    }
    ans = min(ans, use[p] + query(p, p) - 2 * use[p]);
    st.insert(pii(dep[p], use[p]));
    if (!flag) {
        for (int i = in[p]; i < out[p]; i++) {
            int a = path[i];
            st.erase(st.find(pii(dep[a], use[a])));
        }
    }
}
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]].push_back({H[i][1], L[i]});
        g[H[i][1]].push_back({H[i][0], L[i]});
    }
    dfs(0, 0);
    dfs1(0, 0, 1);
    return ans > N ? -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...