Submission #335999

#TimeUsernameProblemLanguageResultExecution timeMemory
335999SwanDreaming (IOI13_dreaming)C++14
100 / 100
249 ms22380 KiB
#include <bits/stdc++.h> #include "dreaming.h" #define stop system("pause") using namespace std; const int maxn = 1e5+123; vector<vector<pair<int, int> > > v; vector<vector<pair<int, int> > > newGraph; bool used[maxn]; pair<int, int> fst[maxn]; pair<int, int> snd[maxn]; int up[maxn]; vector<pair<int, int>> bestNodes; void dfs(int u, int w, int p = -1){ used[u] = 1; fst[u].first = 0; snd[u].first = 0; fst[u].second = -1; snd[u].second = -1; for(int i = 0; i < v[u].size();i++){ int to = v[u][i].first; if(used[to])continue; dfs(to, v[u][i].second, u); } for(int i = 0; i < v[u].size();i++){ int to = v[u][i].first; if(to == p)continue; if(fst[to].first + v[u][i].second > fst[u].first){ snd[u] = fst[u]; fst[u] = {fst[to].first + v[u][i].second, to}; }else if(fst[to].first + v[u][i].second > snd[u].first){ snd[u].first = fst[to].first + v[u][i].second; snd[u].second = to; } if(snd[to].first + v[u][i].second > snd[u].first && (fst[u].second != to)){ snd[u].first = snd[to].first + v[u][i].second; snd[u].second = to; } } } void dfs2(int u, int w, int p = -1){ used[u] = 1; if(p!= -1){ up[u] = up[p] + w; } if(fst[p].second != u){ up[u] = max(up[u], fst[p].first + w); }else{ up[u] = max(up[u], snd[p].first + w); } for(int i = 0; i < v[u].size();i++){ int to = v[u][i].first; if(used[to])continue; dfs2(to, v[u][i].second, u); } } pair<int,int> best; void dfs3(int u){ used[u] = 1; int kek = max(up[u], fst[u].first); if(kek < best.first){ best.first = kek; best.second = u; } for(int i = 0; i < v[u].size();i++){ int to = v[u][i].first; if(used[to])continue; dfs3(to); } } pair<int, int> findFarthest(int u, int p = -1){ pair<int, int> best; best.first = 0; best.second = u; for(int i = 0; i < newGraph[u].size();i++){ int to = newGraph[u][i].first; if(to == p)continue; int cost = newGraph[u][i].second; pair<int, int> b = findFarthest(to, u); if(cost + b.first > best.first){ best = {cost + b.first, b.second}; } } return best; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { v.resize(N + 2); newGraph.resize(N + 2); for(int i = 0; i < M;i++){ int a = A[i]; int b = B[i]; v[a].push_back({b, T[i]}); v[b].push_back({a, T[i]}); newGraph[a].push_back({b, T[i]}); newGraph[b].push_back({a, T[i]}); } for(int i = 0; i < N;i++){ if(!used[i])dfs(i, 0); } for(int i = 0; i < N;i++){ used[i] = 0; } for(int i = 0; i < N;i++){ if(!used[i])dfs2(i, 0); } for(int i = 0; i < N;i++){ used[i] = 0; } for(int i = 0; i < N;i++){ if(used[i])continue; best.first = INT_MAX; dfs3(i); bestNodes.push_back(best); } sort(bestNodes.begin(), bestNodes.end()); for(int i = 0; i < bestNodes.size() - 1;i++){ int from = bestNodes[i].second; int to = bestNodes.back().second; newGraph[from].push_back({to, L}); newGraph[to].push_back({from, L}); //cout << "ttt " << from << ' ' << to << ' ' << L << endl; } pair<int, int> fst = findFarthest(0); //cout << "da " << fst.second << endl; pair<int, int> snd = findFarthest(fst.second); return snd.first; }

Compilation message (stderr)

dreaming.cpp: In function 'void dfs(int, int, int)':
dreaming.cpp:22:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |     for(int i = 0; i < v[u].size();i++){
      |                    ~~^~~~~~~~~~~~~
dreaming.cpp:27:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     for(int i = 0; i < v[u].size();i++){
      |                    ~~^~~~~~~~~~~~~
dreaming.cpp: In function 'void dfs2(int, int, int)':
dreaming.cpp:54:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for(int i = 0; i < v[u].size();i++){
      |                    ~~^~~~~~~~~~~~~
dreaming.cpp: In function 'void dfs3(int)':
dreaming.cpp:70:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |     for(int i = 0; i < v[u].size();i++){
      |                    ~~^~~~~~~~~~~~~
dreaming.cpp: In function 'std::pair<int, int> findFarthest(int, int)':
dreaming.cpp:81:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |     for(int i = 0; i < newGraph[u].size();i++){
      |                    ~~^~~~~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:123:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |     for(int i = 0; i < bestNodes.size() - 1;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...