#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];
vector<int> geallonp(int a, int b) {
vector<int> p1, p2;
while (a != b) {
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) {
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];
ll sum[N];
ll solveComponent(int rootVertex) {
ll sol = 0;
verts.clear();
queue<int> q;
q.push(rootVertex);
vis[rootVertex] = true;
while (!q.empty()) {
int a = q.front();
q.pop();
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;
vis[b] = true;
q.push(b);
parrent[b] = a;
graph_edges[i].seen = true;
}
}
}
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);
}
}
}
{
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);
for (auto &v : path) {
blocked[v] = true;
}
reverse(verts.begin(), verts.end());
for (auto &a : verts) {
for (auto &i : g[a]) {
int b = graph_edges[i].a + graph_edges[i].b - a;
if (blocked[b] || b == parrent[a]) {
continue;
}
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);
}
}
for (auto &v : path) {
sol = max(sol, bbpath[v]);
value.push_back(under[v]);
}
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);
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:104:9: warning: unused variable 'cost' [-Wunused-variable]
104 | int cost = graph_edges[index].cost;
| ^~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
19 ms |
39380 KB |
Output is correct |
2 |
Incorrect |
21 ms |
39532 KB |
Output isn't correct |
3 |
Correct |
19 ms |
39484 KB |
Output is correct |
4 |
Incorrect |
20 ms |
39488 KB |
Output isn't correct |
5 |
Correct |
20 ms |
39500 KB |
Output is correct |
6 |
Incorrect |
24 ms |
39372 KB |
Output isn't correct |
7 |
Incorrect |
19 ms |
39500 KB |
Output isn't correct |
8 |
Correct |
18 ms |
39500 KB |
Output is correct |
9 |
Incorrect |
18 ms |
39476 KB |
Output isn't correct |
10 |
Correct |
18 ms |
39516 KB |
Output is correct |
11 |
Correct |
17 ms |
39512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
21 ms |
39500 KB |
Output is correct |
2 |
Correct |
20 ms |
39500 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
19 ms |
39628 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
25 ms |
40652 KB |
Output is correct |
2 |
Correct |
33 ms |
42164 KB |
Output is correct |
3 |
Incorrect |
26 ms |
40976 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
38 ms |
43340 KB |
Output is correct |
2 |
Correct |
47 ms |
45648 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
127 ms |
53356 KB |
Output is correct |
2 |
Correct |
88 ms |
54704 KB |
Output is correct |
3 |
Correct |
106 ms |
59216 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
135 ms |
62960 KB |
Output is correct |
2 |
Correct |
208 ms |
78792 KB |
Output is correct |
3 |
Correct |
183 ms |
77456 KB |
Output is correct |
4 |
Correct |
228 ms |
94836 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
305 ms |
97652 KB |
Output is correct |
2 |
Correct |
734 ms |
113536 KB |
Output is correct |
3 |
Correct |
250 ms |
87696 KB |
Output is correct |
4 |
Correct |
313 ms |
107628 KB |
Output is correct |
5 |
Correct |
372 ms |
108164 KB |
Output is correct |
6 |
Incorrect |
1022 ms |
100792 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
321 ms |
103208 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |