Submission #941330

#TimeUsernameProblemLanguageResultExecution timeMemory
941330Mike_VuRace (IOI11_race)C++14
0 / 100
3 ms12892 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 = 2e5+5;
const int maxx = 1e9+7;

int n, k;
vector<pii> a[maxn];

bitset<maxn> del;
int child[maxn];
int sz, root;

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 (v == p || del[v]) continue;
        couchild(v, u);
        child[u] += child[v];
    }
}
int centroid(int u, int p) {
    for (int i = 0 ;i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (v == p || del[v]) continue;
        if (child[v] >= (sz >> 1)) return centroid(v, u);
    }
    return u;
}

int h[maxn];
int dis[maxn];
int tk[1000007];
vector<pii> temp;

void dfs(int u, int p) {
    temp.push_back({dis[u], h[u]});
    if (tk[k-dis[u]] < maxx) {
        minimize(ans, h[u] + tk[k-dis[u]]);
    }
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (v == p || del[v]) continue;
        int w = a[u][i].se;
        if (dis[u] + w > k) continue;
        dis[v] = dis[u] + w;
        h[v] = h[u] + 1;
        dfs(v, u);
    }
}

void dfsr(int u, int p) {
    tk[dis[u]] = maxx;
    for (int i = 0; i < (int)a[u].size(); i++) {
        int v = a[u][i].fi;
        if (v == p || del[v]) continue;
        int w = a[u][i].se;
        if (dis[u] + w > k) continue;
        dfsr(v, u);
    }
}

void solve(int u) {
    couchild(u, 0);
    sz = child[u];
    //get centroid
    root = centroid(u, 0);
    //dfs solve
    h[root] = dis[root] = 0;
    for (int i = 0; i < (int)a[root].size(); i++) {
        int v = a[u][i].first, w = a[u][i].se;
        if (del[v]) continue;
        if (w > k) continue;
        dis[v] = dis[u] + w;
        h[v] = h[u]+1;
        dfs(v, u);
        for (int i = 0; i < (int)temp.size(); i++) {
            minimize(tk[temp[i].fi], temp[i].se);
        }
        temp.clear();
    }
    //dfs erase
    dfsr(root, 0);
    del[root] = true;
    //solve sub
    for (int i = 0; i < (int)a[root].size(); i++) {
        int v = a[u][i].first;
        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 = 1; i <= n; i++) {
        int u = H[i][0], v = H[i][1];
        int w = L[i];
        a[u].pb({v, w});
        a[v].pb({u, w});
    }
    for (int i = 1; i <= k; i++) {
        tk[i] = maxx;
    }
    solve(1);
    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...