Submission #1194090

#TimeUsernameProblemLanguageResultExecution timeMemory
1194090SpyrosAlivRace (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long

vector<vector<pair<int, int>>> tree;
vector<int> sub;
vector<bool> del;
int n, k;
int ans = -1;
vector<int> cnt;

void calc_subs(int node, int par) {
    sub[node] = 1;
    for (auto [next, w]: tree[node]) {
        if (del[next] || next == par) continue;
        calc_subs(next, node);
        sub[node] += sub[next];
    }
}

int find_centroid(int node, int tot, int par = 0) {
    for (auto [next, w]: tree[node]) {
        if (del[next] || next == par) continue;
        if (sub[next] * 2 >= tot) return find_centroid(next, tot, node);
    }
    return node;
}

void add(int node, int par, ll totLen, int dep = 1, int v) {
    if (totLen > k) return;
    if (!cnt[totLen]) {
        cnt[totLen] = dep;
    }
    else cnt[totLen] = min(cnt[totLen], dep);
    if (v == 0) cnt[totLen] = 0;
    for (auto [next, w]: tree[node]) {
        if (next == par || del[next]) continue;
        add(next, node, totLen + w, dep+1);
    }
}

void find_ans(int node, int par, ll totLen, int dep = 1) {
    if (totLen > k) return;
    ll need = k - totLen;
    if (need == 0) {
        if (ans == -1) ans = dep;
        else ans = min(ans, dep);
    }
    if (need > 0 && cnt[need]) {
        if (ans == -1) ans = cnt[need] + dep;
        else ans = min(ans, cnt[need] + dep);
    }
    for (auto [next, w]: tree[node]) {
        if (next == par || del[next]) continue;
        find_ans(next, node, totLen + w, dep+1);
    }
}

void build(int node) {
    calc_subs(node, 0);
    int cd = find_centroid(node, sub[node]);
    cnt.clear();
    for (auto [next, w]: tree[cd]) {
        if (del[next]) continue;
        find_ans(next, cd, w);
        add(next, cd, w, 1);
    }
    cnt.clear();
    del[cd] = true;
    for (auto [next, w]: tree[cd]) {
        if (del[next]) continue;
        add(next, cd, w, 0);
    }
    for (auto [next, w]: tree[cd]) {
        if (del[next]) continue;
        build(next);
    }
}

int best_path(int N, int K, int H[][2], int L[]) {
    n = N;
    k = K;
    tree.resize(n+1);
    del.assign(n+1, false);
    sub.assign(n+1, 0);
    for (int i = 0; i < n-1; i++) {
        H[i][0]++;
        H[i][1]++;
        tree[H[i][0]].push_back({H[i][1], L[i]});
        tree[H[i][1]].push_back({H[i][0], L[i]});
    }
    cnt.assign(k+1, 0);
    build(1);
    return ans;
}
/*
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, k; cin >> n >> k;
    int H[n-1][2], L[n];
    for (int i = 0; i < n-1; i++) {
        cin >> H[i][0] >> H[i][1] >> L[i];
    }
    cout << best_path(n, k, H, L) << "\n";
}*/

Compilation message (stderr)

race.cpp:29:57: error: default argument missing for parameter 5 of 'void add(int, int, long long int, int, int)'
   29 | void add(int node, int par, ll totLen, int dep = 1, int v) {
      |                                                     ~~~~^
race.cpp:29:44: note: ...following parameter 4 which has a default argument
   29 | void add(int node, int par, ll totLen, int dep = 1, int v) {
      |                                        ~~~~^~~~~~~