제출 #1316128

#제출 시각아이디문제언어결과실행 시간메모리
1316128mikras꿈 (IOI13_dreaming)C++20
100 / 100
65 ms14912 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; using ll=long long; constexpr int MAXN=1e5+7; constexpr int INF=1e9+7; int t[MAXN]; int gl[MAXN]; int odl[MAXN][2]; vector<pair<int,int>> graf[MAXN]; pair<pair<int,int>,int> kraw[MAXN]; vector<int> spojna[MAXN]; int sigma[MAXN][2]; int srodek[MAXN]; int n,m,l; int Znajdz(int v){ if (v==t[v]) return v; t[v]=Znajdz(t[v]); return t[v]; } void Polacz(int a,int b){ a=Znajdz(a); b=Znajdz(b); if (gl[a]>gl[b]) swap(a,b); t[a]=b; if (gl[a]==gl[b]) gl[b]++; } void DFS(int v,int p,int c,bool x){ if (p==0) odl[v][x]=0; else odl[v][x]=odl[p][x]+c; for (pair<int,int> u:graf[v]){ if (u.first==p) continue; DFS(u.first,v,u.second,x); } } int solve(){ odl[0][0]=-1;odl[0][1]=-1; for (int i=1;i<=n;i++) t[i]=i; int a,b,c; for (int i=0;i<m;i++) Polacz(kraw[i].first.first,kraw[i].first.second); for (int i=1;i<=n;i++) spojna[Znajdz(i)].push_back(i); int turbo_srodek=-1; int mxo=-INF,o; for (int i=1;i<=n;i++){ if (t[i]!=i) continue; DFS(i,0,0,0); for (int v:spojna[i]){ if (odl[v][0]>odl[sigma[i][1]][0]) sigma[i][1]=v; } DFS(sigma[i][1],0,0,1); for (int v:spojna[i]){ if (odl[v][1]>odl[sigma[i][0]][1]) sigma[i][0]=v; } DFS(sigma[i][0],0,0,0); srodek[i]=i; for (int v:spojna[i]){ if (max(odl[v][0],odl[v][1])<max(odl[srodek[i]][0],odl[srodek[i]][1])) srodek[i]=v; } if (mxo<max(odl[srodek[i]][0],odl[srodek[i]][1])){ turbo_srodek=srodek[i]; mxo=max(odl[srodek[i]][0],odl[srodek[i]][1]); } } for (int i=1;i<=n;i++){ if (t[i]!=i) continue; if (srodek[i]==turbo_srodek) continue; graf[srodek[i]].push_back({turbo_srodek,l}); graf[turbo_srodek].push_back({srodek[i],l}); } DFS(1,0,0,0); a=0; for (int i=1;i<=n;i++){ if (odl[i][0]>odl[a][0]) a=i; } DFS(a,0,0,1); b=0; for (int i=1;i<=n;i++){ if (odl[i][1]>odl[b][1]) b=i; } return odl[b][1]; } int travelTime(int _n,int _m,int _l,int _A[],int _B[],int _T[]){ n=_n;m=_m;l=_l; int a,b,c; for (int i=0;i<m;i++){ a=_A[i];b=_B[i];c=_T[i]; a++;b++; graf[a].push_back({b,c}); graf[b].push_back({a,c}); kraw[i]={{a,b},c}; } return solve(); } //int main(){ // ios_base::sync_with_stdio(0); // cin.tie(0); //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...