#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
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 time |
Memory |
Grader output |
1 |
Correct |
19 ms |
39372 KB |
Output is correct |
2 |
Correct |
20 ms |
39492 KB |
Output is correct |
3 |
Correct |
27 ms |
39564 KB |
Output is correct |
4 |
Correct |
19 ms |
39384 KB |
Output is correct |
5 |
Correct |
19 ms |
39504 KB |
Output is correct |
6 |
Correct |
19 ms |
39456 KB |
Output is correct |
7 |
Correct |
21 ms |
39448 KB |
Output is correct |
8 |
Correct |
21 ms |
39492 KB |
Output is correct |
9 |
Correct |
19 ms |
39452 KB |
Output is correct |
10 |
Correct |
21 ms |
39500 KB |
Output is correct |
11 |
Correct |
19 ms |
39480 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
39600 KB |
Output is correct |
2 |
Correct |
19 ms |
39524 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
39632 KB |
Output is correct |
2 |
Correct |
1067 ms |
39984 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
2091 ms |
40700 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
2073 ms |
44904 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
2092 ms |
54792 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
2071 ms |
54160 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
273 ms |
91432 KB |
Output is correct |
2 |
Runtime error |
570 ms |
131076 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
292 ms |
131076 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |