Submission #784706

#TimeUsernameProblemLanguageResultExecution timeMemory
784706vjudge1Race (IOI11_race)C++17
21 / 100
3074 ms11636 KiB
#include <bits/stdc++.h>
#include "race.h"

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast,unroll-loops")

using namespace std;

#define endl '\n'
#define ll long long
#define all(x) x.begin(), x.end()

vector<pair<int, int>> g[200005];
bool processed[200005];
int sz[200005];

int getSize(int cur, int par = -1) {
    sz[cur] = 1;
    for (auto next : g[cur]) {
        if (next.first != par && !processed[next.first]) sz[cur] += getSize(next.first, cur);
    }
    return sz[cur];
}

int getCentroid(int cur, int des, int par = -1) {
    for (auto next : g[cur]) {
        if (next.first != par && !processed[next.first] && sz[next.first] > des / 2) return getCentroid(next.first, des, cur);
    }
    return cur;
}

int ans = 10e7, k;
int depths[1000005];
vector<int> v;

void solve(int cur, int par, int depth, int sum, int t) {
    if (sum > k || depth >= ans) return;
    if (t == 0) ans = min(ans, depth + depths[k - sum]);
    if (t == 1) {
        depths[sum] = min(depths[sum], depth);
        v.push_back(sum);
    }
    for (auto next : g[cur]) {
        if (next.first != par && !processed[next.first]) {
            solve(next.first, cur, depth + 1, sum + next.second, t);
        }
    }
}

void decompose(int cur = 0) {
    int centroid = getCentroid(cur, getSize(cur));
    processed[cur] = 1;
    for (auto x : v) depths[x] = 10e7;
    depths[0] = 0;
    v.clear();
    for (auto next : g[cur]) {
        if (!processed[next.first]) {
            solve(next.first, -1, 1, next.second, 0);
            solve(next.first, -1, 1, next.second, 1);
        }
    }
    for (auto next : g[cur]) {
        if (!processed[next.first]) decompose(next.first);
    }
}

int best_path(int N, int K, int H[][2], int L[]) {
    k = K;
    for (int i = 0; i <= k; i++) depths[i] = 10e7;
    ans = N;
    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]});
    } 
    decompose();
    if (ans == N) return -1;
    else return ans;
}

Compilation message (stderr)

race.cpp: In function 'void decompose(int)':
race.cpp:52:9: warning: unused variable 'centroid' [-Wunused-variable]
   52 |     int centroid = getCentroid(cur, getSize(cur));
      |         ^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...