Submission #261202

#TimeUsernameProblemLanguageResultExecution timeMemory
261202tbzardRace (IOI11_race)C++14
100 / 100
679 ms35940 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, pii> pipii;
typedef pair<pii, int> piipi;
typedef pair<pii, pii> piipii;

#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()
#define eb emplace_back

vector<pii> g[200005];
bool vis[200005];
int sub[200005];
int nn = 0;
int ans = 1e9;

void dfs1(int u, int p){
    sub[u] = 1;
    nn++;
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].fi;
        if(v == p || vis[v]) continue;
        dfs1(v, u);
        sub[u] += sub[v];
    }
}

int dfs2(int u, int p){
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].fi;
        if(v == p || vis[v]) continue;
        if(sub[v] > nn/2) return dfs2(v, u);
    }
    return u;
}

int best[1000005];
vector<pii> val;
void dfs3(int u, int p, int d, int c, int k){
    if(c > k) return;
    if(best[k-c] != -1) ans = min(ans, best[k-c] + d);
    val.eb(mp(c, d));
    for(int i=0;i<sz(g[u]);i++){
        int v = g[u][i].fi, w = g[u][i].se;
        if(v == p || vis[v]) continue;
        dfs3(v, u, d+1, c+w, k);
    }
}

void decompose(int u, int p, int k){
    nn = 0;
    dfs1(u, 0);
    int centroid = dfs2(u, 0);
    vis[centroid] = 1;

    vector<int> dist;
    best[0] = 0;
    dist.eb(0);
    for(int i=0;i<sz(g[centroid]);i++){
        int v = g[centroid][i].fi, w = g[centroid][i].se;
        if(v == p || vis[v]) continue;
        val.clear();
        dfs3(v, centroid, 1, w, k);
        for(int j=0;j<sz(val);j++){
            if(best[val[j].fi] == -1 || best[val[j].fi] > val[j].se) best[val[j].fi] = val[j].se;
            dist.eb(val[j].fi);
        }
    }
    for(int i=0;i<sz(dist);i++){
        best[dist[i]] = -1;
    }

    for(int i=0;i<g[centroid].size();i++){
        int v = g[centroid][i].fi;
        if(v == p || vis[v]) continue;
        decompose(v, centroid, k);
    }
}
int best_path(int n, int k, int h[][2], int l[]){
    for(int i=0;i<n-1;i++){
        g[h[i][0]].eb(mp(h[i][1], l[i]));
        g[h[i][1]].eb(mp(h[i][0], l[i]));
    }
    memset(best, -1, sizeof(best));
    decompose(0, -1, k);
    if(ans == 1e9) ans = -1;
    return ans;
}

Compilation message (stderr)

race.cpp: In function 'void dfs1(int, int)':
race.cpp:26:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[u].size();i++){
                 ~^~~~~~~~~~~~
race.cpp: In function 'int dfs2(int, int)':
race.cpp:35:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[u].size();i++){
                 ~^~~~~~~~~~~~
race.cpp: In function 'void decompose(int, int, int)':
race.cpp:79:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[centroid].size();i++){
                 ~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...