Submission #501722

#TimeUsernameProblemLanguageResultExecution timeMemory
501722600MihneaIslands (IOI08_islands)C++17
80 / 100
583 ms131076 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Edge { int a, b, cost; bool seen = false; }; const int N = (int) 1e6 + 7; const ll INF = (ll) 1e18; int n; int parrent[N]; Edge graph_edges[N]; vector<int> g[N], verts; bool vis[N]; int dep[N]; int epar[N]; void build1dfsdfs(int a) { vis[a] = true; verts.push_back(a); for (auto &i : g[a]) { int b = graph_edges[i].a + graph_edges[i].b - a; if (!vis[b]) { dep[b] = 1 + dep[a]; epar[b] = i; build1dfsdfs(b); parrent[b] = a; graph_edges[i].seen = true; } } } vector<int> geallonp(int a, int b) { vector<int> p1, p2; while (a != b) { assert(1 <= a && a <= n); assert(1 <= b && b <= n); if (dep[a] > dep[b]) { p1.push_back(a); a = parrent[a]; } else { p2.push_back(b); b = parrent[b]; } } p1.push_back(a); reverse(p2.begin(), p2.end()); for (auto &x : p2) { p1.push_back(x); } return p1; } vector<int> geallonpedges(int a, int b) { vector<int> p1, p2; while (a != b) { assert(1 <= a && a <= n); assert(1 <= b && b <= n); if (dep[a] > dep[b]) { p1.push_back(epar[a]); a = parrent[a]; } else { p2.push_back(epar[b]); b = parrent[b]; } } reverse(p2.begin(), p2.end()); for (auto &x : p2) { p1.push_back(x); } return p1; } bool blocked[N]; ll under[N]; ll bbpath[N]; void dfs(int a, int p = -1) { for (auto &i : g[a]) { int b = graph_edges[i].a + graph_edges[i].b - a; if (blocked[b] || b == p) { continue; } dfs(b, a); bbpath[a] = max(bbpath[a], bbpath[b]); bbpath[a] = max(bbpath[a], under[b] + graph_edges[i].cost + under[a]); under[a] = max(under[a], under[b] + graph_edges[i].cost); } } ll sum[N]; ll solveComponent(int rootVertex) { ll sol = 0; verts.clear(); build1dfsdfs(rootVertex); vector<int> nnseeng; for (auto &v : verts) { for (auto &i : g[v]) { if (!graph_edges[i].seen) { graph_edges[i].seen = true; nnseeng.push_back(i); } } } assert((int) nnseeng.size() == 1); { int index = nnseeng[0]; int a = graph_edges[index].a; int b = graph_edges[index].b; int cost = graph_edges[index].cost; vector<int> path = geallonp(a, b); vector<int> edges = geallonpedges(a, b); vector<ll> value; edges.push_back(index); assert((int) edges.size() == (int) path.size()); for (auto &v : path) { blocked[v] = true; } for (auto &v : path) { dfs(v); sol = max(sol, bbpath[v]); value.push_back(under[v]); } assert((int) value.size() == (int) path.size()); ll total = 0; for (auto &i : edges) { total += graph_edges[i].cost; } ll cur = 0; for (int i = 1; i <= (int) edges.size(); i++) { cur += graph_edges[edges[i - 1]].cost; sum[i] = cur; } int y = (int) value.size(); ll c1 = -INF, c2 = -INF; for (int r = 0; r < y; r++) { ll b1 = c1 + sum[r] + value[r]; ll b2 = c2 + total + value[r] - sum[r]; c1 = max(c1, value[r] - sum[r]); c2 = max(c2, sum[r] + value[r]); sol = max(sol, b1); sol = max(sol, b2); } } return sol; } signed main() { /// L < P ios::sync_with_stdio(0); cin.tie(0); /// freopen ("input2", "r", stdin); cin >> n; for (int i = 1; i <= n; i++) { int j, c; cin >> j >> c; graph_edges[i].a = i; graph_edges[i].b = j; graph_edges[i].cost = c; } for (int i = 1; i <= n; i++) { g[graph_edges[i].a].push_back(i); g[graph_edges[i].b].push_back(i); } ll sol = 0; for (int i = 1; i <= n; i++) { if (!vis[i]) { sol += solveComponent(i); } } cout << sol << "\n"; return 0; }

Compilation message (stderr)

islands.cpp: In function 'll solveComponent(int)':
islands.cpp:116:9: warning: unused variable 'cost' [-Wunused-variable]
  116 |     int cost = graph_edges[index].cost;
      |         ^~~~
#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...