제출 #253390

#제출 시각아이디문제언어결과실행 시간메모리
253390ChrisTDreaming (IOI13_dreaming)C++17
100 / 100
114 ms10620 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; #define pii pair<int,int> #define piii pair<int,pii> #define MAXN 100000 #define ll long long int #define pil pair<int,ll> vector<pii> adj[MAXN]; bool vis[MAXN]; int dist[MAXN], dist2[MAXN]; int last[MAXN]; queue<int> q; pii furthest (int n){ pii ans = {0,0}; dist[n] = 0; last[n] = -1; q.push(n); while (!q.empty()) { int cur = q.front(); q.pop(); for (pii p : adj[cur]) if (dist[p.first] == -1) { dist[p.first] = dist[cur] + p.second; last[p.first] = cur; if (dist[p.first] > ans.second) { ans.second = dist[p.first]; ans.first = p.first; } q.push(p.first); } } return ans; } int far (int n) { q.push(n); int cur = 0, best=0,ans=0; dist2[n] = 0; while (!q.empty()) { cur = q.front(); if (dist2[cur] > best) { best = dist2[cur]; ans = cur; } vis[cur] = true; q.pop(); for (pii p : adj[cur]) if (!vis[p.first]) { q.push(p.first); dist2[p.first] = dist2[cur] + p.second; } } return ans; } int travelTime (int N, int M, int L, int A[], int B[], int T[]) { memset(dist,-1,sizeof(dist)); memset(vis,0,sizeof(vis)); for (int x = 0; x < M; x++) { adj[A[x]].push_back({B[x],T[x]}); adj[B[x]].push_back({A[x],T[x]}); } int components = 0; int max1 = 0, max2 = 0, max3 = 0,maxdiam = 0; for (int x = 0; x < N; x++) if (!vis[x]) { components++; if(!adj[x].size()) continue; pii diameter = furthest(far(x)); int cur = diameter.first; int dista = diameter.second, radiusish = dista/2, radius = 0; maxdiam = max(maxdiam,dista); while (dist[last[cur]] > radiusish) cur = last[cur]; radius = min(max(dist[cur],dista-dist[cur]),max(dist[last[cur]],dista-dist[last[cur]])); if (radius >= max1) { max3 = max2; max2 = max1; max1 = radius; } else if (radius >= max2) { max3 = max2; max2 = radius; } else if (radius > max3) max3 = radius; } if (components == 1) return maxdiam; if (components == 2) return max(max1+max2+L,maxdiam); return max(max1+max2+L,max(maxdiam,max2+max3+L*2)); }
#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...