제출 #1288039

#제출 시각아이디문제언어결과실행 시간메모리
1288039bbbirosRace (IOI11_race)C++20
100 / 100
556 ms129608 KiB
#include "race.h" #include <iostream> #include <vector> #include <cstring> #include <string> #include <iomanip> #include <algorithm> #include <fstream> #include <cmath> #include <unordered_set> #include <set> #include <unordered_map> #include <map> #define ll long long #define X first #define Y second using namespace std; int n, k; const int MAXN = 200010; vector<pair<int,int>> v[MAXN]; int par[MAXN]; map<int, int> m[MAXN]; int ans=MAXN; int depth[MAXN],depthlen[MAXN]; void dfs1(int beg,int par) { for(auto nb:v[beg]) { if(nb.X==par)continue; depth[nb.X]=depth[beg]+1; depthlen[nb.X]=depthlen[beg]+nb.Y; dfs1(nb.X,beg); } } int findpar(int x) { if(par[x]==x)return x; return par[x]=findpar(par[x]); } void join(int a,int b,int lca) { a=findpar(a); b=findpar(b); if(a==b)return; if(m[b].size()>m[a].size())m[a].swap(m[b]); for(auto [key,value] : m[b]) { if(value==0)continue; int third=k-key+2*depthlen[lca]; int anss=m[a][third]; if(anss==0)continue; ans=min(ans,anss+value-2*depth[lca]); } for(auto [key,value] : m[b]) { if(value==0)continue; if(m[a][key]==0 || m[a][key]>value)m[a][key]=value; } par[b]=a; } void dfs2(int beg,int par) { for(auto nb:v[beg]) { if(nb.X==par)continue; dfs2(nb.X,beg); join(beg,nb.X,beg); } } int best_path(int N, int K, int H[][2], int L[]) { n = N; k = K; for (int i = 0; i < n-1; i++) { v[H[i][0]+1].push_back({H[i][1]+1,L[i]}); v[H[i][1]+1].push_back({H[i][0]+1,L[i]}); } depth[1]=0; depthlen[1]=0; dfs1(1,1); for(int i=1;i<=n;i++) { //cout<<i<<' '<<depth[i]<<" "<<depthlen[i]<<endl; par[i]=i; m[i][depthlen[i]]=depth[i]; } dfs2(1,1); if(ans==MAXN)ans=-1; 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...