RT,目前讨论区能看到的hack都过了(有一些系统维护看不见不知道对不对)
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pii = pair<LL, LL>;
const int kMaxN = 1e6 + 5;
const LL kInf = 1e16;
int vis[kMaxN], v[kMaxN], s[kMaxN << 1], q[kMaxN << 1], ind[kMaxN], l = 1, r, tot, n;
LL f[kMaxN], lx[kMaxN << 1], rx[kMaxN << 1], vs[kMaxN << 1], ans, val;
vector<Pii> g[kMaxN];
vector<int> id[kMaxN];
void D(int u, int fa) {
vector<LL> vp;
for (Pii i : g[u]) {
if (i.first != fa && vis[i.first]) {
D(i.first, u);
f[u] = max(f[u], f[i.first] + i.second);
vp.push_back(f[i.first] + i.second);
}
}
sort(vp.begin(), vp.end(), greater<LL>());
(vp.size() > 1) && (val = max(val, vp[0] + vp[1]));
vp.size() && (val = max(val, vp[0]));
}
void S(int u, int pre) {
s[++tot] = u, v[u] = 1;
for (int p = 0; p < g[u].size(); p++) {
Pii i = g[u][p];
if (!vis[i.first] && !v[i.first]) {
vs[tot] = i.second;
S(i.first, id[u][p]);
} else if (!vis[i.first] && v[i.first] && pre != id[u][p]) {
vs[tot] = i.second;
}
}
}
void V() {
for (int i = 1; i <= tot; i++) {
s[i + tot] = s[i], vs[i + tot] = vs[i];
}
LL tag = 0;
l = 1, r = 0;
for (int i = 1; i <= tot * 2; i++) {
for (; l <= r && q[l] <= i - tot; l++) {
}
q[++r] = i, lx[i] = f[s[i]] - tag;
val = max(val, (l == r) ? (lx[q[l]] + tag) : (lx[q[l]] + tag + f[s[i]]));
tag += vs[i];
}
l = 1, r = tag = 0;
for (int i = tot * 2; i >= 1; i--) {
for (; l <= r && q[l] >= i + tot; l++) {
}
q[++r] = i, lx[i] = f[s[i]] - tag;
val = max(val, (l == r) ? (lx[q[l]] + tag) : (lx[q[l]] + tag + f[s[i]]));
tag += vs[i - 1];
}
for (int i = 1; i <= r; i++) {
q[i] = 0;
}
for (int i = 1; i <= tot * 2; i++) {
lx[i] = rx[i] = 0;
vs[i] = s[i] = 0;
}
}
int main() {
ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1, v, w; i <= n; i++) {
cin >> v >> w;
ind[v]++, ind[i]++;
g[i].push_back({v, w}), g[v].push_back({i, w});
id[i].push_back(i), id[v].push_back(i);
}
for (int i = 1; i <= n; i++) {
(ind[i] == 1) && (q[++r] = i);
}
for (; l <= r; l++) {
int x = q[l];
vis[x] = 1;
for (Pii i : g[x]) {
--ind[i.first];
(ind[i.first] == 1) && (q[++r] = i.first);
}
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
D(i, 0);
}
}
for (int i = 1; i <= n; i++) {
if (!vis[i] && !v[i]) {
S(i, 0);
V();
ans += val;
val = tot = 0;
}
}
cout << ans;
return 0;
}