Submission #1317598

#TimeUsernameProblemLanguageResultExecution timeMemory
1317598ElayV13Dreaming (IOI13_dreaming)C++20
100 / 100
179 ms29720 KiB
#include "dreaming.h" #include "bits/stdc++.h" using namespace std; const int N = 100001; const int INF = INT_MAX; int n; vector<pair<int,int>>G[N]; map<pair<int,int>,int>dsc; void add(int u,int v,int w) { dsc[{u,v}]=w; dsc[{v,u}]=w; G[u].push_back({v,w}); G[v].push_back({u,w}); } bool vis[N]; vector<int>all; void dfs(int v) { all.push_back(v); vis[v]=1; for(pair<int,int> nxt : G[v]) { int u=nxt.first; if(!vis[u]) dfs(u); } } int dis[N]; pair<int,int>get(int v) { for(int u : all) dis[u]=INF; queue<int>q; q.push(v); dis[v]=0; while(!q.empty()) { int node=q.front(); q.pop(); for(pair<int,int> nxt : G[node]) { int u=nxt.first; int w=nxt.second; if(dis[node]+w<dis[u]) { dis[u]=dis[node]+w; q.push(u); } } } pair<int,int>res={-INF,-INF}; for(int u : all) res=max(res,{dis[u] , u}); return res; } vector<int> get_path(int u,int v) { for(int u : all) dis[u]=INF; queue<int>q; q.push(u); dis[u]=0; while(!q.empty()) { int node=q.front(); q.pop(); for(pair<int,int> nxt : G[node]) { int u=nxt.first; if(dis[node]+1<dis[u]) { dis[u]=dis[node]+1; q.push(u); } } } vector<int>res; int cur_node=v; while(1) { res.push_back(v); if(v==u) break; int mn=INF; for(pair<int,int> node : G[v]) mn=min(mn,dis[node.first]); for(pair<int,int> node : G[v]) { if(dis[node.first]==mn) { v=node.first; break; } } } return res; } pair<int,int> find_center() { pair<int,int>mx1=get(all[0]); pair<int,int>mx2=get(mx1.second); int u=mx1.second; int v=mx2.second; int tot=mx2.first; int cur=0; vector<int>path=get_path(u,v); if(path.size()==1) { return {path[0],0}; } vector<pair<int,int>>srt; for(int i=1;i<path.size();i++) { int wg=dsc[{path[i-1],path[i]}]; cur+=wg; tot-=wg; srt.push_back({max(cur,tot),path[i]}); } sort(srt.begin(),srt.end()); return {srt[0].second,srt[0].first}; } pair<int,int> get_mx(int v) { vector<int>d(n,INF); queue<int>q; d[v]=0; q.push(v); while(!q.empty()) { int node=q.front(); q.pop(); for(pair<int,int> nxt : G[node]) { int u=nxt.first; int w=nxt.second; if(d[node]+w<d[u]) { d[u]=d[node]+w; q.push(u); } } } pair<int,int>res; for(int i=0;i<n;i++) res=max(res,{d[i],i}); return res; } int get_dia() { pair<int,int>mx1=get_mx(0); pair<int,int>mx2=get_mx(mx1.second); return mx2.first; } int travelTime(int N , int M , int L , int A[] , int B[] , int T[]) { n = N; for(int i = 0;i < M;i++) add(A[i] , B[i] , T[i]); vector < pair < int , int > > srt; for(int i = 0;i < N;i++) { if(vis[i]) continue; all.clear(); dfs(i); pair < int , int > cw = find_center(); int center = cw.first; int max_w = cw.second; srt.push_back({max_w , center}); } sort(srt.rbegin() , srt.rend()); for(int i = 1;i < srt.size();i++) add(srt[0].second , srt[i].second , L); return get_dia(); }
#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...