Submission #300136

#TimeUsernameProblemLanguageResultExecution timeMemory
300136HeheheDreaming (IOI13_dreaming)C++14
100 / 100
111 ms19188 KiB
#include<bits/stdc++.h> //:3 using namespace std; typedef long long ll; #define DIM 100010 #define INF 2000000000 #include "dreaming.h" #define pi pair<int, int> const int N = 1e5 + 11; const ll inf = 2e9; int path[N], viz[N], s[N], dp_up[N], dp_down[N], nr; vector<pi> v[N]; vector<int> c[N]; void dfs (int nod, int tata){ viz[nod] = 1; c[nr].push_back(nod); for (int i=0;i<v[nod].size();i++){ int vecin = v[nod][i].first; if (vecin != tata){ dfs (vecin,nod); s[nod] = max (s[nod],s[vecin]+v[nod][i].second); }} int maxim = 0, maxim2 = 0; for (int i=0;i<v[nod].size();i++){ int vecin = v[nod][i].first, cost = v[nod][i].second; if (vecin == tata) continue; if (s[vecin]+cost > maxim){ maxim2 = maxim; maxim = s[vecin]+cost; } else { if (s[vecin]+cost > maxim2) maxim2 = s[vecin]+cost; }} dp_down[nod] = maxim+maxim2; } void dfs2 (int nod, int tata, int cost){ dp_up[nod] = max (dp_up[nod],dp_up[tata]+cost); int maxim = 0, maxim2 = 0, p = 0; for (int i=0;i<v[nod].size();i++){ int fiu = v[nod][i].first, cst = v[nod][i].second; if (fiu == tata) continue; if (s[fiu]+cst > maxim){ maxim2 = maxim; maxim = s[fiu]+cst, p = fiu; } else if (s[fiu]+cst > maxim2) maxim2 = s[fiu]+cst; } for (int i=0;i<v[nod].size();i++){ int fiu = v[nod][i].first; if (fiu == tata) continue; if (fiu == p) dp_up[fiu] = max (dp_up[fiu],maxim2+v[nod][i].second); else dp_up[fiu] = max (dp_up[fiu],maxim+v[nod][i].second); } for (int i=0;i<v[nod].size();i++){ int vecin = v[nod][i].first; if (vecin != tata) dfs2 (vecin,nod,v[nod][i].second); }} int travelTime (int n, int m, int l, int a[], int b[], int cost[]){ for(int i = 0; i <= n; i++){ v[i].clear(); } for(int i = 0; i < m; i++){ int x = a[i], y = b[i], z = cost[i]; x++, y++; v[x].push_back({y, z}); v[y].push_back({x, z}); } memset(viz,0,sizeof(viz)); memset(dp_up,0,sizeof(dp_up)); memset(dp_down,0,sizeof(dp_down)); memset(s,0,sizeof(s)); for(int i = 1; i <= n; i++){ if(viz[i])continue; nr++; dfs(i, 0); dfs2(i, 0, 0); } int ans = 0; for(int i = 1;i <= nr; i++){ int mn = inf; for(auto nod : c[i]){ int dist_max = max(dp_up[nod] + s[nod], dp_down[nod]); ans = max(ans, dist_max); int dist = max(s[nod], dp_up[nod]); mn = min(mn,dist); } path[i] = mn; } sort(path + 1, path + nr + 1); if(nr >= 2)ans = max(ans, path[nr] + path[nr - 1] + l); if(nr >= 3)ans = max(ans, path[nr - 1] + path[nr - 2] + 2*l); return ans; }

Compilation message (stderr)

dreaming.cpp: In function 'void dfs(int, int)':
dreaming.cpp:19:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for (int i=0;i<v[nod].size();i++){
      |                  ~^~~~~~~~~~~~~~
dreaming.cpp:26:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |     for (int i=0;i<v[nod].size();i++){
      |                  ~^~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfs2(int, int, int)':
dreaming.cpp:43:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     for (int i=0;i<v[nod].size();i++){
      |                  ~^~~~~~~~~~~~~~
dreaming.cpp:54:19: 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[nod].size();i++){
      |                  ~^~~~~~~~~~~~~~
dreaming.cpp:63:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for (int i=0;i<v[nod].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...