제출 #1333588

#제출 시각아이디문제언어결과실행 시간메모리
1333588qilby경주 (Race) (IOI11_race)C++20
43 / 100
3095 ms30292 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 200009;

bool was[N];
int n, k, res, sz[N], can[N * 5];
vector < array < int , 2 > > g[N];

void sizes(int v, int p) {
    sz[v] = 1;
    for (auto to : g[v]) if (!was[to[0]] && to[0] != p) {
        sizes(to[0], v);
        sz[v] += sz[to[0]];
    }
}

int get(int v, int p, int m) {
    for (auto to : g[v]) if (!was[to[0]] && to[0] != p && sz[to[0]] * 2 > m) return get(to[0], v, m);
    return v;
}

void dfs(int v, int p, int len, int d) {
    if (len > k) return;
    res = min(res, d + can[k - len]);
    for (auto to : g[v]) if (!was[to[0]] && to[0] != p) dfs(to[0], v, len + to[1], d + 1);
}

void add(int v, int p, int len, int d, bool e = 0) {
    if (len > k) return;
    if (!e) can[len] = min(can[len], d); else can[len] = (int)1e9;
    for (auto to : g[v]) if (!was[to[0]] && to[0] != p) add(to[0], v, len + to[1], d + 1, e);
}

void go(int v) {
    sizes(v, v);
    int c = get(v, v, sz[v]);
    was[c] = 1;

    can[0] = 0;

    for (auto to : g[c]) {
        dfs(to[0], c, to[1], 1);
        add(to[0], c, to[1], 1);
    }
    for (auto to : g[c]) add(to[0], c, to[1], 1, 1);

    for (auto to : g[c]) if (!was[to[0]]) go(to[0]);
}

int best_path(int n_, int k_, int h[][2], int a_[]) {
    n = n_, k = k_;

    for (int i = 0; i < n - 1; i++) {
        g[h[i][0]].push_back({h[i][1], a_[i]});
        g[h[i][1]].push_back({h[i][0], a_[i]});
    }

    if (can[1] != (int)1e9) for (int i = 0; i <= k; i++) can[i] = (int)1e9;
    res = (int)1e9;
    go(0);

    return (res < (int)1e9 ? res : -1);
}

/*int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> k;

    int h[100][2], a[100];
    for (int i = 0; i < n - 1; i++) cin >> h[i][0] >> h[i][1] >> a[i];

    cout << best_path(n, k, h, a);
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...