Submission #1337024

#TimeUsernameProblemLanguageResultExecution timeMemory
1337024piotrekRace (IOI11_race)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;
typedef long long ll;

vector<vector<pair<int, ll>>> G;
int K;
vector<bool> C_vis;
vector<int> subtr;

int dfs_subtr(int v, int p) {
    subtr[v] = 1;
    for(auto [sas, w] : G[v])
        if(sas != p && !C_vis[sas])
            subtr[v] += dfs_subtr(sas, v);
    return subtr[v];
}

int find_cen(int v, int p, int s) {
    for(auto [sas, w] : G[v])
        if(sas != p && !C_vis[sas] && subtr[sas] > s/2) return find_cen(sas, v, s);
    return v;
}

int wyn = INT_MAX;

void dfs(int v, int p, unordered_map<ll, int>& m, ll D, int d) {
    if(m.find(D) == m.end()) m[D] = d;
    else m[D] = min(m[D], d);
    for(auto [sas, w] : G[v])
        if(sas != p && !C_vis[sas]) 
            dfs(sas, v, m, D+w, d+1);
}

void count(int c) {
    int s = dfs_subtr(c, c);
    c = find_cen(c, c, s);
    C_vis[c] = true;

    for(auto [sas, w] : G[c])
        if(!C_vis[sas]) count(sas);

    unordered_map<ll, int> m;
    m[0] = 0;

    for(auto [sas, w] : G[c]) {
        unordered_map<ll, int> m2;
        dfs(sas, c, m2, w, 1);
        for(auto [D, d] : m2) 
            if(m.find(K-D) != m.end()) wyn = min(wyn, m[K-D] + d);
        for(auto [D, d] : m2) 
            if(m.find(D) == m.end()) m[D] = d;
            else m[D] = min(m[D], d);
    }
}

int best_path(int n, int K, int H[][2], int L[])
{
    G.clear(); G.resize(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]});
    ::K = K;
    C_vis.clear(); C_vis.resize(n);
    subtr.clear(); subtr.resize(n);
    wyn = INT_MAX;
    count(0);
    return wyn == INT_MAX ? -1 : wyn;
}

//----------------
/*int main() {
    int n, k; cin >> n >> k;
    int H[n-1][2]; for(int i = 0; i < n-1; i++) cin >> H[i][0] >> H[i][1];
    int L[n-1]; for(int i = 0; i < n-1; i++) cin >> L[i];
    cout << best_path(n, k, H, L) << '\n';
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...