Submission #943163

#TimeUsernameProblemLanguageResultExecution timeMemory
943163Mike_VuRace (IOI11_race)C++14
100 / 100
266 ms67528 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double dou;
#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second

//const ll mod = 1e9+7;

bool maximize(ll &x, ll y ){
    if (x < y) {x = y; return true;};
    return false;
}
bool minimize(int &x, int y){
    if (x > y) {x = y; return true;}
    return false;
}
//void add(ll &x, ll y ){
//    x += y;
//    if (x >= mod) x -= mod;
//}
//void sub(ll &x, ll y) {
//    x -= y;
//    if (x < 0) x += mod;
//}

const int maxn = 1e6+5;
const int maxx = 1e9+7;

int n, k;
vector<pii> a[maxn];
bool del[maxn] = {0};
int child[maxn], target;
int ans = maxx;

void couchild(int u, int p) {
    child[u] = 1;
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (del[v] || v == p) continue;
        couchild(v, u);
        child[u] += child[v];
    }
}
int find_centroid(int u, int p) {
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v=  a[u][i].fi;
        if (del[v] || v == p) continue;
        if (child[v] * 2 > target) return find_centroid(v, u);
    }
    return u;
}

int h[maxn], dis[maxn], min_length[maxn];
vector<int> undo;
vector<pii> updates;
void dfs(int u, int p) {
    if (dis[u] > k) return;
    minimize(ans, h[u] + min_length[k-dis[u]]);
    updates.push_back(make_pair(dis[u], h[u]));
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v = a[u][i].first;
        if (del[v] || v == p) continue;
        int w = a[u][i].se;
        dis[v] = dis[u] + w;
        h[v] = h[u] + 1;
        dfs(v, u);
    }
}

void solve(int u) {
    couchild(u, -1);
    target = child[u];
    u = find_centroid(u, -1);
    del[u] = true;
    h[u] = dis[u] = 0;
    min_length[0] = 0;
    //solve
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (del[v]) continue;
        int w = a[u][i].se;
        dis[v] = w;
        h[v] = 1;
        dfs(v, u);
        //update
        for (int i = 0; i < (int)updates.size(); i++) {
            minimize(min_length[updates[i].fi], updates[i].se);
            undo.push_back(updates[i].fi);
        }
        updates.clear();
    }
    //clear
    for (int i = 0; i < (int)undo.size(); i++) {
        min_length[undo[i]] = maxx;
    }
    undo.clear();
    for (int i =0; i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (del[v]) continue;
        solve(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];
        int w = L[i];
        ++u;
        ++v;
        a[u].pb({v, w});
        a[v].pb({u, w});
    }
    for (int i = 1; i <= k; i++) {
        min_length[i] = maxx;
    }
    solve(1);
    return (ans >= maxx ? -1 : ans);
}

//#define Mike_Vui
#ifdef Mike_Vui
int N, K, H[maxn][2], L[maxn];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> K;
    for (int i = 1; i < N; i++) {
        cin >> H[i][0] >> H[i][1];
    }
    for (int i = 1; i < N; i++) {
        cin >> L[i];
    }
    cout <<  best_path(N, K, H, L);
}
#endif // Mike_Vui
/*
4 3
0 1
1 2
1 3
1
2
4
3 3
0 1
1 2
1
1
11 12
0 1
0 2
2 3
3 4
4 5
0 6
6 7
6 8
8 9
8 10
3
4
5
4
6
3
2
5
6
7
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...