Submission #1318585

#TimeUsernameProblemLanguageResultExecution timeMemory
1318585JohanDreaming (IOI13_dreaming)C++20
65 / 100
778 ms35800 KiB
#include "dreaming.h" #include "bits/stdc++.h" using namespace std; const int N = 1e5 + 5; int pa[N]; vector < int > adj[N]; unordered_map < int , int > dist, vis; map < pair < int , int > , int > we; vector < int > par(N, -1); int find(int u){ if(par[u] < 0)return u; else return par[u] = find(par[u]); } void uni(int u, int v){ u = find(u); v = find(v); if(u == v)return; par[u] += par[v]; par[v] = u; } int bfs(int st){ queue < int > q; map < int , int > dis; q.push(st); dis[st] = 0; while(q.size() > 0){ int u = q.front(); q.pop(); for(auto v : adj[u]){ if(dis.count(v) == 0){ dis[v] = dis[u] + we[{u, v}]; q.push(v); } } } int node, mx = -1; for(auto [nd, val] : dis){ if(val > mx){ mx = val; node = nd; } } return node; } void dfs(int u, int end){ vis[u] = true; for(auto v : adj[u]){ if(!vis[v]){ pa[v] = u; dfs(v, end); } } } pair < int , int > centre(int st, int end){ int sz = 0; vector < int > path = {end}; while(end != st){ sz += we[{end, pa[end]}]; end = pa[end]; path.push_back(end); } int mn = sz, diametr = sz, cur = 0, node = path[0], far; for(int i = 1; i < path.size(); i++){ int W = we[{path[i], path[i - 1]}]; sz -= W; cur += W; if(mn > max(sz, cur)){ if(sz > cur)far = path.back(); else far = path[0]; mn = max(sz, cur); node = path[i]; } } return {diametr, node}; } pair < int , int > find_diametr(int Node){ int u = bfs(Node); int v = bfs(u); dfs(u, v); return {u, v}; } int travelTime(int n, int m, int L, int u[], int v[], int w[]){ for(int i = 0; i < m; i++){ we[{u[i], v[i]}] = w[i]; we[{v[i], u[i]}] = w[i]; adj[u[i]].push_back(v[i]); adj[v[i]].push_back(u[i]); uni(u[i], v[i]); } set < int > cmps; for(int i = 0; i < n; i++) cmps.insert(find(i)); vector < pair < int , int > > x; for(auto nd : cmps){ pair < int , int > p = find_diametr(nd); int u = p.first; int v = p.second; x.push_back(centre(u, v)); } sort(x.rbegin(), x.rend()); int Node = x[0].second; for(int i = x.size() - 1; i >= 1; i--){ adj[Node].push_back(x[i].second); adj[x[i].second].push_back(Node); we[{Node, x[i].second}] = L; we[{x[i].second, Node}] = L; } vis.clear(); pair < int , int > p = find_diametr(Node); return centre(p.first, p.second).first; }
#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...