Submission #1312682

#TimeUsernameProblemLanguageResultExecution timeMemory
1312682kevin264Dreaming (IOI13_dreaming)C++20
100 / 100
258 ms35288 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;
#define endl '\n'
#define sz(x) (int)(x.size()) 
#define ff first
#define ss second
#define m_p make_pair
#define INF INT_MAX
#define OO LLONG_MAX
using vi=vector<int>;
using vvi=vector<vi>; 
using pii=pair<int,int>; 
using vvpii = vector<vector<pii > >;
using u_m=unordered_map<int,int>;
template<typename T> using inverse_pq = priority_queue<T,vector<T>, greater<T> >; 
template<typename T=int> void cin_vector(vector<T> &v) {for(int& i : v) cin>>i;}

pair<int,u_m> djikstra(int start, unordered_map<int, vector<pii> >& g){
inverse_pq<pii> pq;
u_m dist; 
pii ans={-1,-1};
pq.push({0,start});
dist[start]=0; 
while(!pq.empty()){
   int w=pq.top().ff,top=pq.top().ss; pq.pop();
   if(w>dist[top]) continue;  
   if(ans.ss<w) ans={top,w};   
   for(auto i :g[top]){
    int d=i.ss+w;
    if(dist.find(i.ff)==dist.end() or dist[i.ff]>d){
        dist[i.ff]=d;
        pq.push({d,i.ff});
    }
   }
}
return m_p(ans.ff,dist);
}

pii get_diameter_radius(unordered_map<int, vector<pii> >& g){
pair<int,u_m> pr=djikstra(g.begin()->ff,g);
int a=pr.ff;
pr=djikstra(a,g);
u_m dista=pr.ss;
u_m distb=djikstra(pr.ff,g).ss;
int radius=-1;
for(auto number : g){
   // cout<<i<<": "<<dista[i]<<" "<<distb[i]<<' '<<max(dista[i],distb[i])<<endl;
   int i=number.ff;
radius=radius==-1 or max(dista[i],distb[i])<radius ? max(dista[i],distb[i]) : radius;
}

return {distb[a],radius};
}

int travelTime(int N, int M, int L, 
  int A[], int B[], int T[]){
  int n=N;
  vector<vector<pii> > g(n); 
  for(int i=0;i<M;i++){
    g[A[i]].push_back({B[i],T[i]});
    g[B[i]].push_back({A[i],T[i]});
  }
vi p;
int maximum_diameter=0;
vector<bool> visited(n, false); 
for(int i=0;i<n;i++){
   if(!visited[i]){
    unordered_map<int,vector<pii>> current; 
    visited[i]=true;
    queue<int> q;
    q.push(i); 
    current[i]={}; 
    while(!q.empty()){
      int top=q.front(); q.pop(); 
      for(auto j : g[top]){
        if(!visited[j.ff]){
          q.push(j.ff);
          visited[j.ff]=true;
          current[j.ff].push_back({top,j.ss});
          current[top].push_back({j.ff,j.ss});
        }
      }
    }
    pii pr=get_diameter_radius(current); 
    p.push_back(pr.ss);
    maximum_diameter=max(maximum_diameter,pr.ff); 
   }
}
sort(p.begin(),p.end(),greater<int> ()); 
if(p.size()==1)
return maximum_diameter;
if(p.size()==2)
  return max(maximum_diameter,p[0]+p[1]+L); 
return max(maximum_diameter,max(p[0]+p[1]+L, p[1]+p[2]+2*L));

  }
#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...