Submission #67521

#TimeUsernameProblemLanguageResultExecution timeMemory
67521KubalionzzaleDreaming (IOI13_dreaming)C++14
18 / 100
1075 ms13480 KiB
#include "dreaming.h" #include <iostream> #include <vector> #include <assert.h> int component[100010] = { 0 }; int best[100010] = { 0 }; int componentmin[100010] = { 0 }; int curmax[100010] = { 0 }, curmax2[100010] = { 0 }; int n, m, l; std::vector< std::vector< std::pair<int, int> > > g(100010); void dfs(int index, int parent, int mark) { for (int i = 0; i < g[index].size(); ++i) { int next = g[index][i].second; int nextVal = g[index][i].first; if (next != parent) { dfs(next, index, mark); curmax[index] = std::max(curmax[index], curmax[next] + nextVal); } } component[index] = mark; } void dfsout(int index, int parent, int pathSum) { int max1 = best[index], max2 = -1; for (int i = 0; i < g[index].size(); ++i) { int next = g[index][i].second; int nextVal = g[index][i].first; if (next != parent) { if (nextVal + curmax[next] > max1) { max2 = max1; max1 = nextVal + curmax[next]; } else if (nextVal + curmax[next] > max2) { max2 = nextVal + curmax[next]; } } } for (int i = 0; i < g[index].size(); ++i) { int next = g[index][i].second; int nextVal = g[index][i].first; if (next != parent) { if (nextVal + curmax[next] == max1) { curmax[next] = std::max(curmax[next], nextVal + max2); best[next] = max2 + nextVal; } else { curmax[next] = std::max(curmax[next], nextVal + max1); best[next] = max1 + nextVal; } dfsout(next, index, 0); } } } int dfs2(int index, int parent, int sum) { int max = sum; for (int i = 0; i < g[index].size(); ++i) { int next = g[index][i].second; int nextVal = g[index][i].first; if (next != parent) { max = std::max(max, dfs2(next, index, sum + nextVal)); } } return max; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { n = N; m = M; l = L; for (int i = 0; i < m; ++i) { g[A[i]].push_back(std::make_pair(T[i], B[i])); g[B[i]].push_back(std::make_pair(T[i], A[i])); } int cnt = 1; for (int i = 0; i < n; ++i) { if (!component[i]) { dfs(i, -1, cnt); dfsout(i, -1, 0); ++cnt; } } for (int i = 0; i < n; ++i) { curmax2[i] = dfs2(i, -1, 0); } for (int i = 1; i < cnt; ++i) { componentmin[i] = 1e9 + 5; } for (int i = 0; i < n; ++i) { componentmin[component[i]] = std::min(componentmin[component[i]], curmax2[i]); // std::cout << i << " " << curmax[i] << " " << curmax2[i] << "\n"; } int ans = 0; int max = -1; int maxindex; for (int i = 1; i < cnt; ++i) { if (componentmin[i] > max) { max = componentmin[i]; maxindex = i; } } for (int i = 0; i < n; ++i) { ans = std::max(ans, curmax2[i]); } if (m == n - 1) return componentmin[1]; for (int i = 1; i < cnt; ++i) { if (i != maxindex) { ans = std::max(ans, l + max + componentmin[i]); } } int max1 = -1, max1index; for (int i = 1; i < cnt; ++i) { if (i != maxindex) { if (componentmin[i] > max1) { max1 = componentmin[i]; max1index = i; } } } for (int i = 1; i < cnt; ++i) { if (i != maxindex && i != max1index) { ans = std::max(ans, max1 + 2 * l + componentmin[i]); } } return ans; }

Compilation message (stderr)

dreaming.cpp: In function 'void dfs(int, int, int)':
dreaming.cpp:16:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[index].size(); ++i)
                     ~~^~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfsout(int, int, int)':
dreaming.cpp:34:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[index].size(); ++i)
                     ~~^~~~~~~~~~~~~~~~~
dreaming.cpp:53:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[index].size(); ++i)
                     ~~^~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int dfs2(int, int, int)':
dreaming.cpp:79:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[index].size(); ++i)
                     ~~^~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:176:32: warning: 'max1index' may be used uninitialized in this function [-Wmaybe-uninitialized]
         if (i != maxindex && i != max1index)
                              ~~^~~~~~~~~~~~
#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...