제출 #1213973

#제출 시각아이디문제언어결과실행 시간메모리
1213973tuankhang13경주 (Race) (IOI11_race)C++20
100 / 100
624 ms38796 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
using namespace std;

const int maxn = 2e5 + 13;
int n, k, res;
vector<pii> adj[maxn];
vector<int> del(maxn, 0), child(maxn);
map<int, int> mp;

void dfs(int u, int p) {
    child[u] = 1;
    for (auto x : adj[u]) {
        int v = x.fi;
        if (v != p && !del[v]) {
            dfs(v, u);
            child[u] += child[v];
        }
    }
}

int find_ctroid(int u, int p, int sz) {
    for (auto x : adj[u]) {
        int v = x.fi;
        if (v != p && !del[v] && child[v] > sz / 2) {
            return find_ctroid(v, u, sz);
        }
    }
    return u;
}

void cointect(int u, int p, int depth, int dist, bool fil) {
    if (dist > k) return;
    if (fil) {
        if (mp.find(dist) != mp.end()) {
            mp[dist] = min(mp[dist], depth);
        } else {
            mp[dist] = depth;
        }
    } else {
        if (mp.find(k - dist) != mp.end()) {
            res = min(res, depth + mp[k - dist]);
        }
    }
    for (auto x : adj[u]) {
        int v = x.fi;
        if (v != p && !del[v]) {
            cointect(v, u, depth + 1, dist + x.se, fil);
        }
    }
}

void decompose(int u) {
    dfs(u, 0);
    int ct = find_ctroid(u, 0, child[u]);
    del[ct] = 1;

    mp.clear();
    mp[0] = 0;

    for (auto x : adj[ct]) {
        int v = x.fi;
        if (!del[v]) {
            cointect(v, ct, 1, x.se, 0);  
            cointect(v, ct, 1, x.se, 1);  
        }
    }

    for (auto x : adj[ct]) {
        int v = x.fi;
        if (!del[v]) {
            decompose(v);
        }
    }
}

int best_path(int N, int K, int H[][2], int L[]) {
    n = N;
    k = K;

    for (int i = 0; i < n - 1; ++i) {
        int u = H[i][0], v = H[i][1], w = L[i];
        ++u, ++v;  
        adj[u].pb({v, w});
        adj[v].pb({u, w});
    }

    res = INT_MAX;
    decompose(1);  

    return (res == INT_MAX ? -1 : res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...