Submission #109961

#TimeUsernameProblemLanguageResultExecution timeMemory
109961MetBIslands (IOI08_islands)C++14
80 / 100
1194 ms132096 KiB
#include <iostream> #include <cstdlib> #include <string> #include <set> #include <map> #include <algorithm> #include <bitset> #include <queue> #include <math.h> #include <stack> #include <vector> #include <string.h> #include <random> typedef long long ll; const ll MOD = 1e9 + 7, INF = 1e18; using namespace std; int n, m, p[1000001], cost[1000001]; bitset <1000000> is_cycle, u, c; ll d[1000001][2], root[1000000]; ll pref[2000001]; deque < pair <ll, int> > q_max; vector < pair <int, int> > g[1000001]; pair <int, int> g_un[1000001]; vector < pair <int, int> > cycle[1000001]; void bfs_traverse (ll x) { queue <int> q; q.push (x); c[x] = 1; while (!q.empty ()) { int x = q.front (); q.pop (); for (auto to : g[x]) if (!c[to.first]) { c[to.first] = 1; q.push (to.first); } } } bool bfs_cycle (ll x, ll color) { while (!u[x]) { u[x] = 1; p[g_un[x].first] = x; cost[g_un[x].first] = g_un[x].second; if (u[g_un[x].first] == 1) break; x = g_un[x].first; } int v = x; auto to = g_un[x]; while (v != to.first) { cycle[color].emplace_back (v, cost[v]); is_cycle[v] = true; v = p[v]; } cycle[color].emplace_back (to.first, to.second); is_cycle[to.first] = true; return true; } ll find_diameter (ll x) { queue < pair <int, int> > q; int mx_i = x; q.push ({x, -1}); c[x] = 1; while (!q.empty ()) { int f = q.front ().first; int p = q.front ().second; q.pop (); if (d[mx_i][0] < d[f][0]) mx_i = f; for (auto to : g[f]) if ((!is_cycle[to.first] || to.first == x) && to.first != p) { d[to.first][0] = d[f][0] + to.second; c[to.first] = 1; q.push ({to.first, f}); } } root[x] = d[mx_i][0]; while (!q.empty ()) q.pop (); q.push ({mx_i, -1}); int dist = mx_i; while (!q.empty ()) { int f = q.front ().first; int p = q.front ().second; q.pop (); if (d[dist][1] < d[f][1]) dist = f; for (auto to : g[f]) if ((!is_cycle[to.first] || to.first == x) && to.first != p) { d[to.first][1] = d[f][1] + to.second; c[to.first] = 1; q.push ({to.first, f}); } } return d[dist][1]; } ll process (vector < pair <int, int> > & cycle) { ll diameter = 0; for (auto x : cycle) diameter = max (diameter, find_diameter (x.first)); ll s = cycle.size (); for (ll i = 2 * cycle.size () - 1; i >= 0; i--) pref[i] = cycle[i % s].second + (i != 2 * cycle.size () - 1 ? pref[i+1] : 0); q_max.clear (); for (ll i = 0; i < s - 1; i++) { while (!q_max.empty () && q_max.back ().first <= pref[i] + root[cycle[i % s].first]) q_max.pop_back (); q_max.emplace_back (pref[i] + root[cycle[i % s].first], i); } for (ll i = s - 1; i < 2 * cycle.size (); i++) { ll k = q_max.front ().first; diameter = max (diameter, k - pref[i] + root[cycle[i % s].first]); while (!q_max.empty () && q_max.back ().first <= pref[i] + root[cycle[i % s].first]) q_max.pop_back (); q_max.emplace_back (pref[i] + root[cycle[i % s].first], i); while (!q_max.empty () && q_max.front ().second <= i - s + 1) q_max.pop_front (); } return diameter; } int main () { cin >> n; for (ll i = 0; i < n; i++) { ll x, l; scanf ("%lld%lld", &x, &l); g[i].emplace_back (x - 1, l); g[x - 1].emplace_back (i, l); g_un[i] = {x - 1, l}; } ll color = 0; for (ll i = 0; i < n; i++) if (!u[i] && !c[i]) { bfs_cycle (i, ++color); bfs_traverse (i); } ll ans = 0; for (ll i = 1; i <= color; i++) ans += process (cycle[i]); cout << ans; }

Compilation message (stderr)

islands.cpp: In function 'll process(std::vector<std::pair<int, int> >&)':
islands.cpp:145:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   pref[i] = cycle[i % s].second + (i != 2 * cycle.size () - 1 ? pref[i+1] : 0);
                                    ~~^~~~~~~~~~~~~~~~~~~~~~~~
islands.cpp:157:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (ll i = s - 1; i < 2 * cycle.size (); i++)
                     ~~^~~~~~~~~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:182:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%lld%lld", &x, &l);
   ~~~~~~^~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...