Submission #1086234

#TimeUsernameProblemLanguageResultExecution timeMemory
1086234rayan_bdRace (IOI11_race)C++17
21 / 100
3091 ms61528 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define pb emplace_back
 
const int mxN = 2e6+10;
const int INF = (int)1e9;
 
vector<pair<int,int>> adj[mxN];
int sz[mxN],N,K,ans=INF;
bool ok[mxN];
vector<int> mnDist((int)1e6+50,INF);
 
void dfs1(int node,int par){
    sz[node]=0;
    for(auto it:adj[node]){
        if(it.first==par||ok[it.first]) continue;
        dfs1(it.first,node);
        sz[node]+=sz[it.first];
    }
    sz[node]++;
}
 
int find(int node,int par){
    for(auto it:adj[node]){
        if(it.first==par||ok[it.first]) continue;
        if(sz[it.first]>=((N+1)/2)){
            return find(it.first,node);
        }
    }
    return node;
}
 
void dfs2(int src,int par,int dist,int h,bool f){
    if(dist>K) return;
    if(f){
        mnDist[dist]=min(mnDist[dist],h);
    }else{
        ans=min(ans,mnDist[K-dist]+h);
    }
    for(auto it:adj[src]){
        if(!ok[it.first]&&it.first!=par){
            dfs2(it.first,src,dist+it.second,h+1,f);
        }
    }
}
 
void res(int u,int p,int dist){
    if(dist>K) return;
    mnDist[dist]=INF;
    for(auto it:adj[u]){
        if(it.first!=p&&!ok[it.first]){
            res(it.first,u,dist+it.second);
        }
    }
}
 
void decompose(int u){
    dfs1(u,-1);
    int cen=find(u,-1);
    mnDist[0]=0;
    for(auto it:adj[u]){
        if(!ok[it.first]){
            dfs2(it.first,u,it.second,1,0);
            dfs2(it.first,u,it.second,1,1);
        }
    }
    res(u,-1,0);
    ok[u]=1;
    for(auto it:adj[u]){
        if(!ok[it.first]){
            decompose(it.first);
        }
    }
}
 
int best_path(int n,int k,int h[][2],int l[]){
    for(int i=0;i<n-1;++i){
        adj[h[i][0]].pb(h[i][1],l[i]);
        adj[h[i][1]].pb(h[i][0],l[i]);
    }
    N=n,K=k;
    decompose(0);
    return ans>=INF?-1:ans;
}

Compilation message (stderr)

race.cpp: In function 'void decompose(int)':
race.cpp:60:9: warning: unused variable 'cen' [-Wunused-variable]
   60 |     int cen=find(u,-1);
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...