Submission #1177545

#TimeUsernameProblemLanguageResultExecution timeMemory
1177545LmaoLmaoRace (IOI11_race)C++17
100 / 100
298 ms34332 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;

using ll = long long;
using ii = pair<ll, ll>;
using aa = array<int,3>;

const int INF = 1e9;

int s[200005];
bool del[200005];
vector<ii> adj[200005];
int mp[1000005];
int d,k,ans;

int dfs(int u,int p) {
    s[u]=1;
    for(ii v:adj[u]) {
        if(del[v.fi] || v.fi==p) continue;
        s[u]+=dfs(v.fi,u);
    }
    return s[u];
}
int citron(int u,int p,int sz) {
    for(ii v:adj[u]) {
        if(del[v.fi] || v.fi==p) continue;
        if(s[v.fi]*2>sz) return citron(v.fi,u,sz);
    }
    return u;
}
stack<int> st;
void get(int u,int p,int cur,int len,int type) {
    d=max(d,cur);
    if(len>k) return;
    if(type) {
        ans=min(ans,cur+mp[k-len]);
    }
    else {
        st.push(len);
        mp[len]=min(mp[len],cur);
    }
    //if(u==1 && cur==1) cout << mp[1];
    for(ii v:adj[u]) {
        if(v.fi!=p && !del[v.fi]) get(v.fi,u,cur+1,len+v.se,type);
    }
}
void build(int u) {
    int ctr=citron(u,0,dfs(u,0));
    d=0;
    del[ctr]=1;
    mp[0]=0;
    for(ii v:adj[ctr]) {
        if(!del[v.fi]) {
            get(v.fi,0,1,v.se,1);
            get(v.fi,0,1,v.se,0);
            //if(ctr==2) cout << k << ' ' << v << endl;
        }
    }
    //cout << ans << ' ' << d << endl;
    while(!st.empty()) {
      mp[st.top()]=1e9;
      st.pop();
    }
    for(ii v:adj[ctr]) {
        if(del[v.fi]) continue;
        build(v.fi);
    }
}

int best_path(int N, int K, int H[][2], int L[]){
  int n = N;
  k = K;
  for(int i = 0; i + 1 < n; ++i){
    int u = H[i][0]+1, v = H[i][1]+1, w = L[i];
    adj[u].push_back({v, w});
    adj[v].push_back({u, w});
  }
  for(int i=1;i<=k;i++) {
        mp[i]=1e9;
    }
    mp[0]=0;
    ans=1e9;
    build(1);
  return (ans == 1e9 ? -1 : 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...