제출 #900609

#제출 시각아이디문제언어결과실행 시간메모리
900609JakobZorzDreaming (IOI13_dreaming)C++17
77 / 100
1098 ms36060 KiB
#include"dreaming.h" #include<iostream> #include<vector> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; vector<pair<ll,ll>>nodes[100000]; bool vis[100000]; vector<ll>node_list; void dfs(ll node){ if(vis[node]) return; vis[node]=true; node_list.push_back(node); for(auto ne:nodes[node]) dfs(ne.first); } ll toll(ll a,ll b){ return (a<<32)+b; } unordered_map<ll,pair<ll,ll>>dp; pair<ll,ll>get_max_dist(ll node,ll prev){ if(dp.count(toll(node,prev))) return dp[toll(node,prev)]; pair<ll,ll>res={0,0}; for(auto ne:nodes[node]){ if(ne.first==prev) continue; { ll curr=get_max_dist(ne.first,node).first+ne.second; if(curr>=res.first){ res.second=res.first; res.first=curr; }else if(curr>res.second){ res.second=curr; } } } dp[toll(node,prev)]=res; return res; } pair<ll,ll> get_diameter(ll root){ node_list.clear(); dfs(root); /*cout<<"- "; for(int i:node_list) cout<<i<<" "; cout<<"\n";*/ ll res=1e18,diam=0; for(ll node:node_list){ //cout<<node<<": "<<get_max_dist(node,node)<<"\n"; auto r=get_max_dist(node,node); res=min(res,r.first); diam=max(diam,r.first+r.second); } return {res,diam}; } int travelTime(int N,int M,int L,int A[],int B[],int T[]){ for(ll i=0;i<M;i++){ nodes[A[i]].emplace_back(B[i],T[i]); nodes[B[i]].emplace_back(A[i],T[i]); } vector<ll>dists; ll diam=0; for(ll i=0;i<N;i++) if(!vis[i]){ auto r=get_diameter(i); dists.push_back(r.first); diam=max(diam,r.second); } sort(dists.begin(),dists.end()); reverse(dists.begin(),dists.end()); if(dists.size()==1) return max(dists[0],diam); else if(dists.size()==2) return max(dists[0]+dists[1]+L,diam); else return max(max(dists[0]+dists[1]+L,dists[1]+dists[2]+2*L),diam); }
#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...