Submission #300141

#TimeUsernameProblemLanguageResultExecution timeMemory
300141HeheheDreaming (IOI13_dreaming)C++14
100 / 100
130 ms17524 KiB
#include<bits/stdc++.h> //:3 using namespace std; typedef long long ll; #define all(a) (a).begin(), (a).end() #define ff first #define ss second #define pb push_back #define mp make_pair #define pi pair<int, int> #define sz(x) (int)((x).size()) //#define int long long #include "dreaming.h" const int dx[] = {0, 1, 0, -1}; const int dy[] = {1, 0, -1, 0}; const ll inf = 2e9; const ll mod = 1e9 + 7; const int N = 1e5 + 11; const ll INF64 = 3e18 + 1; const double eps = 1e-14; const double PI = acos(-1); //ifstream in(".in"); //ofstream out(".out"); 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 P){ c[nr].pb(nod); viz[nod] = 1; for(auto it : v[nod]){ if(it.ff == P)continue; dfs(it.ff, nod); s[nod] = max(s[nod], s[it.ff] + it.ss); } int mx1 = 0, mx2 = 0; for(auto it : v[nod]){ if(it.ff == P)continue; if(s[it.ff] + it.ss > mx1){ mx2 = mx1; mx1 = s[it.ff] + it.ss; continue; } if(s[it.ff] + it.ss > mx2){ mx2 = s[it.ff] + it.ss; continue; } } dp_down[nod] = mx1 + mx2; } void dfs2(int nod, int P, int cost){ dp_up[nod] = max(dp_up[nod], dp_up[P] + cost); int mx1 = 0, mx2 = 0, F = 0; for(auto it : v[nod]){ if(it.ff == P)continue; if(s[it.ff] + it.ss > mx1){ mx2 = mx1; mx1 = s[it.ff] + it.ss; F = it.ff; continue; } if(s[it.ff] + it.ss > mx2){ mx2 = s[it.ff] + it.ss; continue; } } for(auto it : v[nod]){ if(it.ff == P)continue; if(it.ff == F){ dp_up[it.ff] = max(dp_up[it.ff], mx2 + it.ss); continue; } dp_up[it.ff] = max(dp_up[it.ff], mx1 + it.ss); } for(auto it : v[nod]){ if(it.ff == P)continue; dfs2(it.ff, nod, it.ss); } } 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)); int nr_comp = 0; 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 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:116:9: warning: unused variable 'nr_comp' [-Wunused-variable]
  116 |     int nr_comp = 0;
      |         ^~~~~~~
#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...