#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
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 time |
Memory |
Grader output |
1 |
Correct |
18 ms |
39500 KB |
Output is correct |
2 |
Correct |
20 ms |
39416 KB |
Output is correct |
3 |
Correct |
19 ms |
39564 KB |
Output is correct |
4 |
Correct |
19 ms |
39500 KB |
Output is correct |
5 |
Correct |
19 ms |
39500 KB |
Output is correct |
6 |
Correct |
19 ms |
39508 KB |
Output is correct |
7 |
Correct |
19 ms |
39464 KB |
Output is correct |
8 |
Correct |
19 ms |
39500 KB |
Output is correct |
9 |
Correct |
19 ms |
39500 KB |
Output is correct |
10 |
Correct |
19 ms |
39500 KB |
Output is correct |
11 |
Correct |
22 ms |
39500 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
39524 KB |
Output is correct |
2 |
Correct |
19 ms |
39572 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
21 ms |
39568 KB |
Output is correct |
2 |
Correct |
19 ms |
39888 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
24 ms |
40644 KB |
Output is correct |
2 |
Correct |
32 ms |
43420 KB |
Output is correct |
3 |
Correct |
27 ms |
40936 KB |
Output is correct |
4 |
Correct |
24 ms |
40256 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
39 ms |
44808 KB |
Output is correct |
2 |
Correct |
48 ms |
47176 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
91 ms |
54940 KB |
Output is correct |
2 |
Correct |
93 ms |
60200 KB |
Output is correct |
3 |
Correct |
123 ms |
74636 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
133 ms |
64176 KB |
Output is correct |
2 |
Correct |
177 ms |
94224 KB |
Output is correct |
3 |
Correct |
201 ms |
103016 KB |
Output is correct |
4 |
Correct |
251 ms |
131072 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
279 ms |
91384 KB |
Output is correct |
2 |
Runtime error |
583 ms |
131076 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
297 ms |
131072 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |