Submission #481565

#TimeUsernameProblemLanguageResultExecution timeMemory
481565CyberSleeperRace (IOI11_race)C++14
100 / 100
482 ms107520 KiB
#include <bits/stdc++.h>
//#include "race.h"

#define ll      long long
#define pii     pair<ll, ll>
#define fi      first
#define se      second
#define pb      push_back

using namespace std;

const ll MX=200007, INF=1e9+7;

ll N, K, ret=INF;
map<ll, ll> ada[MX];
vector<pii> adj[MX];
pii lazy[MX];

void DFS(int par, int idx){
    lazy[idx]={0, 0};
    ada[idx][0]=0;
    for(auto i:adj[idx]){
        int v=i.fi, w=i.se;
        if(v==par)
            continue;
        DFS(idx, v);
        lazy[v].fi+=w;
        lazy[v].se++;
        if(ada[idx].size()<ada[v].size()){
            swap(ada[idx], ada[v]);
            swap(lazy[idx], lazy[v]);
        }
        for(auto jj:ada[v]){
            pii j=jj;
            j.fi+=lazy[v].fi-lazy[idx].fi;
            j.se+=lazy[v].se-lazy[idx].se;
            if(ada[idx].count(K-j.fi-lazy[idx].fi*2))
                ret=min(ret, lazy[idx].se*2+j.se+ada[idx][K-j.fi-lazy[idx].fi*2]);
        }
        for(auto jj:ada[v]){
            pii j=jj;
            j.fi+=lazy[v].fi-lazy[idx].fi;
            j.se+=lazy[v].se-lazy[idx].se;
            if(ada[idx].count(j.fi))
                ada[idx][j.fi]=min(ada[idx][j.fi], j.se);
            else
                ada[idx][j.fi]=j.se;
        }
    }
    if(ada[idx].count(K-lazy[idx].fi))
        ret=min(ret, lazy[idx].se+ada[idx][K-lazy[idx].fi]);
}

int best_path(int n, int k, int H[][2], int L[]){
    N=n, K=k;
    for(int i=0, u, v, w; i<N-1; i++){
        u=H[i][0], v=H[i][1], w=L[i];
        adj[u].pb({v, w});
        adj[v].pb({u, w});
    }
    DFS(0, 0);
    return (ret>=INF?-1:ret);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...