Submission #501720

#TimeUsernameProblemLanguageResultExecution timeMemory
501720600MihneaIslands (IOI08_islands)C++17
40 / 100
2092 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; 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(); for (int l = 0; l < y; l++) { for (int r = l + 1; r < y; r++) { ll tog = value[l] + value[r]; ll way = 0; for (int j = l; j < r; j++) { way += graph_edges[edges[j]].cost; } assert(way == sum[r] - sum[l]); ll other_way = total - way; sol = max(sol, way + tog); sol = max(sol, other_way + tog); } } } 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:115:9: warning: unused variable 'cost' [-Wunused-variable]
  115 |     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...