Submission #59610

#TimeUsernameProblemLanguageResultExecution timeMemory
59610spencercomptonDreaming (IOI13_dreaming)C++17
100 / 100
267 ms28572 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; vector<int> adj[100000]; vector<int> adjw[100000]; int sub[100000]; bool v[100000]; pair<int, int> dfs3(int now, int from){ pair<int, int> ret = make_pair(0,now); for(int i = 0; i<adj[now].size(); i++){ int to = adj[now][i]; if(to==from){ continue; } pair<int, int> got = dfs3(to,now); got.first += adjw[now][i]; ret = max(ret,got); } return ret; } int dfs1(int now, int from){ v[now] = true; sub[now] = 0; for(int i = 0; i<adj[now].size(); i++){ int to = adj[now][i]; if(to==from){ continue; } sub[now] = max(sub[now],adjw[now][i] + dfs1(to, now)); } return sub[now]; } int dfs2(int now, int from, int above){ int ret = 1000000007; vector<pair<int, int> > li; //deep, loc for(int i = 0; i<adj[now].size(); i++){ int to = adj[now][i]; if(to==from){ continue; } li.push_back(make_pair(sub[to]+adjw[now][i],i)); } if(li.size()==0){ return above; } int maxi = 0; for(int i = 1; i<li.size(); i++){ if(li[i].first > li[maxi].first){ maxi = i; } } ret = min(ret, max(above,li[maxi].first)); int ind = li[maxi].second; for(int i = 0; i<li.size(); i++){ if(i==maxi){ continue; } above = max(above,li[i].first); } above += adjw[now][ind]; ret = min(ret, dfs2(adj[now][ind],now,above)); return ret; } int travelTime(int n, int m, int l, int a[], int b[], int t[]) { for(int i = 0; i<m; i++){ adj[a[i]].push_back(b[i]); adj[b[i]].push_back(a[i]); adjw[a[i]].push_back(t[i]); adjw[b[i]].push_back(t[i]); } for(int i = 0; i<n; i++){ v[i] = false; } vector<int> all; int ans = 0; for(int i = 0; i<n; i++){ if(adj[i].size()==0){ assert(!v[i]); v[i] = true; all.push_back(0); } if(v[i]){ continue; } int diam = dfs3(dfs3(i,-1).second,-1).first; ans = max(ans,diam); dfs1(i,-1); all.push_back(dfs2(i,-1,0)); } for(int i = 0; i<n; i++){ assert(v[i]); } sort(all.begin(),all.end()); if(all.size()>0){ ans = max(ans,all[all.size()-1]); } if(all.size()>1){ ans = max(ans,all[all.size()-1] + all[all.size()-2] + l); } if(all.size()>2){ ans = max(ans,all[all.size()-3] + all[all.size()-2] + l + l); } return ans; }

Compilation message (stderr)

dreaming.cpp: In function 'std::pair<int, int> dfs3(int, int)':
dreaming.cpp:10:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i<adj[now].size(); i++){
                 ~^~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int dfs1(int, int)':
dreaming.cpp:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i<adj[now].size(); i++){
                 ~^~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int dfs2(int, int, int)':
dreaming.cpp:37:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i<adj[now].size(); i++){
                 ~^~~~~~~~~~~~~~~~
dreaming.cpp:48:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i<li.size(); i++){
                 ~^~~~~~~~~~
dreaming.cpp:55:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i<li.size(); i++){
                 ~^~~~~~~~~~
#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...