제출 #1149396

#제출 시각아이디문제언어결과실행 시간메모리
1149396SalihSahin꿈 (IOI13_dreaming)C++20
18 / 100
30 ms12096 KiB
#include<bits/stdc++.h> #include "dreaming.h" #define pb push_back using namespace std; const int MAXN = 1e5 + 5; vector<pair<int, int> > adj[MAXN]; vector<int> dis(MAXN), vis(MAXN), p(MAXN); int mx = -1, mxi = -1; void dfs(int node, int par, int len){ p[node] = par; dis[node] = len; vis[node] = 1; if(dis[node] > mx){ mx = dis[node]; mxi = node; } for(auto itr: adj[node]){ if(itr.first != par){ dfs(itr.first, node, len + itr.second); } } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { multiset<int> mset; for(int i = 0; i < M; i++){ adj[A[i]].pb({B[i], T[i]}); adj[B[i]].pb({A[i], T[i]}); } for(int i = 0; i < N; i++){ if(vis[i]) continue; mx = mxi = -1; dfs(i, i, 0); int a = mxi; mx = mxi = -1; dfs(a, a, 0); int b = mxi; // b -> a int best = mx, node = b; while(node != p[node]){ best = min(best, max(dis[node], mx - dis[node])); node = p[node]; } mset.insert(best); } if(mset.size() == 1){ return (*mset.begin()); } else if(mset.size() == 2){ int sum = 0; for(auto itr: mset) sum += itr; sum += L; return sum; } else{ auto lst = mset.end(); lst--; int mx1 = *lst; lst--; int mx2 = *lst; lst--; int mx3 = *lst; int ans = max(mx1 + mx2 + L, mx2 + mx3 + 2 * L); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...