This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX_N = 1000001;
#define ll long long
int t[MAX_N], l[MAX_N], vis[MAX_N];
ll dist[MAX_N];
bool cycle[MAX_N];
vector<int> edges[MAX_N];
ll ans = 0;
vector<int> cur;
void dfs2(int x, int p, ll d) {
cur.push_back(x);
dist[x] = d;
for (int i : edges[x]) {
if (!cycle[i] && i != p) dfs2(i, x, d+(t[x]==i ? l[x] : l[i]));
}
}
void dfs3(int x, int p, ll d) {
dist[x] = d;
for (int i : edges[x]) {
if ((!cycle[x] || !cycle[i]) && i != p) dfs3(i, x, d+(t[x]==i ? l[x] : l[i]));
}
}
void solve(vector<int> cyc) {
ll best = 0, len = 0, psa = 0, x = -1e9, y = -1e9;
for (int i : cyc) len += l[i];
for (int i : cyc) {
cur.clear();
dfs2(i, i, 0);
ll m = -1;
int b;
for (int j : cur) {
if (dist[j] > m) {
m = dist[j];
b = j;
}
}
best = max(best, max(psa+m+x, len+m-psa+y));
x = max(x, m-psa);
y = max(y, m+psa);
psa += l[i];
dfs3(b, b, 0);
ll diameter = -1;
for (int j : cur) diameter = max(diameter, dist[j]);
best = max(best, diameter);
}
ans += best;
}
void dfs(int v, int c) {
vis[v] = c;
if (vis[t[v]] == c && !cycle[t[v]]) {
vector<int> cyc = {v}, psa;
for (int i=t[v]; i!=v; i=t[i]) cyc.push_back(i);
for (int i : cyc) cycle[i] = true;
solve(cyc);
}
if (vis[t[v]] == -1) dfs(t[v], c);
}
int main() {
int n;
scanf("%d", &n);
for (int i=1; i<=n; i++) {
scanf("%d%d", &t[i], &l[i]);
cycle[i] = false;
vis[i] = -1;
edges[i].push_back(t[i]);
edges[t[i]].push_back(i);
}
for (int i=1; i<=n; i++) {
if (vis[i] == -1) dfs(i, i);
}
printf("%lld\n", ans);
}
Compilation message (stderr)
islands.cpp: In function 'int main()':
islands.cpp:71:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
71 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
islands.cpp:73:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
73 | scanf("%d%d", &t[i], &l[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
islands.cpp: In function 'void solve(std::vector<int>)':
islands.cpp:50:13: warning: 'b' may be used uninitialized in this function [-Wmaybe-uninitialized]
50 | dfs3(b, b, 0);
| ~~~~^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |