Submission #494505

#TimeUsernameProblemLanguageResultExecution timeMemory
494505Alexandruabcde경주 (Race) (IOI11_race)C++14
43 / 100
3042 ms33352 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

constexpr int NMAX = 2e5 + 5;
constexpr int VALMAX = 1e6 + 5;
constexpr int INF = 1e9;

typedef pair <int, int> PII;

int ans;

vector <PII> G[NMAX];
int Dist;

int Sz[NMAX];
bool sel[NMAX];

int cnt = 0;
PII fr[VALMAX];

void AddToSolution (int Node, int dad, int cost, int Length) {
    if (cost > Dist) return;

    int remain = Dist - cost;
    if (fr[remain].first == cnt)
        ans = min(ans, fr[remain].second + Length);

    for (auto it : G[Node]) {
        int to = it.first;
        int c = it.second;

        if (to == dad || sel[to]) continue;

        AddToSolution(to, Node, cost + c, Length+1);
    }
}

void ChangeFR (int Node, int dad, int cost, int Length) {
    if (cost > Dist) return;

    if (fr[cost].first == cnt)
        fr[cost].second = min(fr[cost].second, Length);
    else {
        fr[cost].first = cnt;
        fr[cost].second = Length;
    }

    for (auto it : G[Node]) {
        int to = it.first;
        int c = it.second;

        if (to == dad || sel[to]) continue;

        ChangeFR(to, Node, cost + c, Length+1);
    }
}

void Dfs (int Node, int dad = -1) {
    Sz[Node] = 1;

    for (auto it : G[Node]) {
        int to = it.first;

        if (to == dad || sel[to]) continue;

        Dfs(to, Node);
        Sz[Node] += Sz[to];
    }
}

int Size;
int centr;

int Centroid (int Node, int dad = -1) {
    int Max = Size - Sz[Node];

    for (auto it : G[Node]) {
        int to = it.first;

        if (to == dad || sel[to]) continue;

        int x = Centroid(to, Node);
        if (x != -1) return x;

        Max = max(Max, Sz[to]);
    }

    if (Max <= (Size + 1) / 2) return Node;

    return -1;
}

void Get (int Root) {
    Dfs(Root);
    Size = Sz[Root];
    centr = Centroid(Root);

    sel[centr] = 1;
    ++ cnt;
    fr[0].first = cnt;
    fr[0].second = 0;
    for (auto it : G[centr]) {
        int to = it.first;

        AddToSolution(to, centr, it.second, 1);
        ChangeFR(to, centr, it.second, 1);
    }

    for (auto it : G[centr]) {
        int to = it.first;

        if (sel[to]) continue;

        Get(to);
    }
}

int best_path(int N, int K, int H[][2], int L[])
{
    ans = INF;
    Dist = 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]});
    }

    Get(0);

    if (ans == INF) return -1;
    else 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...