Submission #1203842

#TimeUsernameProblemLanguageResultExecution timeMemory
1203842edga1경주 (Race) (IOI11_race)C++20
100 / 100
478 ms33220 KiB
#include <bits/stdc++.h>
using namespace std;

vector<pair<int,int>> a[200005];
int s[200005];
int d[200005], len[200005];
int best[1000005];
int rez=1e9,k,n;
vector<int> vert, vals;

int dfs(int x, int p){
    d[x]=1;
    for(int i=0; i<a[x].size(); i++){
        if(!s[a[x][i].first] && a[x][i].first!=p){
            d[x]+=dfs(a[x][i].first,x);
        }
    }
    return d[x];
}

int findc(int x){
    int sk=dfs(x,x);
    int e=1,v=x,p=x;
    while(e){
        e=0;
        if(sk-d[x]>sk/2) e=1;
        int m=0,mpos;
        for(int i=0; i<a[v].size(); i++){
            if(!s[a[v][i].first] && a[v][i].first!=p){
                if(d[a[v][i].first]>m){
                    m=d[a[v][i].first];
                    mpos=a[v][i].first;
                }
            }
        }
        if(m>sk/2) e=1;
        if(e==1){
            p=v;
            v=mpos;
        }
    }
    return v;
}

void dfs2(int x, int p){
    vert.push_back(x);
    for(auto [v,w] : a[x]){
        if(!s[v] && p!=v){
            len[v]=len[x]+1;
            d[v]=d[x]+w;
            if(d[v]>k) continue;
            dfs2(v,x);
        }
    }
}

void cd(int x){
    int c=findc(x);
    s[c]=1;
    best[0]=0;
    for(auto [v,w] : a[c]){
        if(s[v]==1) continue;
        vert.clear();
        len[v]=1;
        d[v]=w;
        dfs2(v,v);
        for(auto vi : vert){
            if(d[vi]<=k){
                rez=min(rez,len[vi]+best[k-d[vi]]);
            }
        }
        for(auto vi : vert){
            if(d[vi]<=k){
                best[d[vi]]=min(best[d[vi]],len[vi]);
                vals.push_back(d[vi]);
            }
        }
    }
    for(auto vi : vals){
        best[vi]=1e9;
    }
    vals.clear();
    for(auto [v,w] : a[c]){
        if(!s[v]) cd(v);
    }
}

int best_path(int N, int K, int h[][2], int l[]){
    k=K;
    n=N;
    for(int i=0; i<N-1; i++){
        a[h[i][0]].push_back({h[i][1],l[i]});
        a[h[i][1]].push_back({h[i][0],l[i]});
    }
    for(int i=1; i<1000005; i++) best[i]=1e9;
    cd(0);
    if(rez==1e9) return -1;
    return rez;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...