Submission #1192557

#TimeUsernameProblemLanguageResultExecution timeMemory
1192557aren_danceRace (IOI11_race)C++20
100 / 100
635 ms40172 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;
const int l=2e5+1;
vector<pair<int,int>> adj[l];
int n,k;
int ans;
bool used[l];
int cnt[l];
int num;
vector<int> p;
int mn(int x,int y){
    if(x==-1){
        return y;
    }
    return min(x,y);
}
void dfs(int node,int parent){
    ++num;
    cnt[node]=1;
    for(auto i:adj[node]){
        if(i.first==parent){
            continue;
        }
        if(used[i.first]){
            continue;
        }
        dfs(i.first,node);
        cnt[node]+=cnt[i.first];
    }
}
bool center(int node,int parent){
    for(auto i:adj[node]){
        if(used[i.first])
        continue;
        if(i.first==parent){
            continue;
        }
        if(cnt[i.first]>num/2){
            return 0;
        }
    }
    return 1;
}
int find_centroid(int node){
    num=0;
    dfs(node,-1);
    if(num==1){
        return -1;
    }
    int gag=node;
    int parent=-1;
    while(!center(gag,parent)){
        for(auto i:adj[gag]){
            if(used[i.first]){
                continue;
            }
            if(i.first==parent){
                continue;
            }
            if(cnt[i.first]>num/2){
                parent=gag;
                gag=i.first;
                break;
            }
        }
    }
    used[gag]=1;
    return gag;
}
map<int,int> mp;
vector<pair<int,int>> mas;
void dfsx(int node,int parent,int root,int her,int r){
    if(node!=root){
        mas.push_back({her,r});
        auto it=mp.find(k-her);
        if(it!=mp.end()){
            ans=mn(ans,it->second+r);
        }
    }
    for(auto i:adj[node]){
        if(i.first==parent){
            continue;
        }
        if(used[i.first]){
            continue;
        }
        if(node==root){
            dfsx(i.first,node,root,her+i.second,r+1);
            auto it=mp.find(k);
            if(it!=mp.end()){
                ans=mn(ans,it->second);
            }
            for(auto j:mas){
                auto itx=mp.find(j.first);
                if(itx==mp.end()){
                    mp.insert({j.first,j.second});
                }
                else{
                    itx->second=min(itx->second,j.second);
                }
            }
            mas.clear();
            continue;
        }
        dfsx(i.first,node,root,her+i.second,r+1);
    }
}
void solve_helper(int u){
    mp.clear();
    mp.insert({0,0});
    dfsx(u,-1,u,0,0);
}
void solve(int node){
    int u=find_centroid(node);
    if(u==-1){
        return ;
    }
    solve_helper(u);
    for(auto i:adj[u]){
        if(!used[i.first]){
            solve(i.first);
        }
    }
    //cout<<node<<" "<<u<<'\n';
}
int best_path(int N, int K, int H[][2], int L[]){
    n=N;
    k=K;
    ans=-1;
    for(int i=0;i<n-1;++i){
        adj[H[i][1]].push_back({H[i][0],L[i]});
        adj[H[i][0]].push_back({H[i][1],L[i]});
    }
    solve(0);
    return 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...