Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <assert.h>
- #include <unordered_map>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef vector < long long > vll;
- typedef pair < long long, long long > pll;
- typedef pair < int, int > pii;
- typedef vector < int > vii;
- #define csl ios_base::sync_with_stdio(false); cin.tie(NULL)
- #define l(x) (((x) << 1) | 1)
- #define r(x) ((l(x)) + 1)
- #define mp make_pair
- #define fst first
- #define snd second
- ll t, n, u, v, m, q, r, ql, qr, k, l, s, x, y, w, c;
- const int N = 1e6 + 500;
- const long long mod = 1e9 + 7;
- const long long INF = 1LL << 57LL;
- const bool JUDGE = false;
- vii adj[N];
- bool vis[N], partcyc[N];
- int nxt[N];
- ll len[N], tl[N];
- ll ans = 0;
- ll ret = 0;
- inline void calc(int v, int p) {
- tl[v] = 0;
- //cout << v << '\n';
- vis[v] = true;
- ll besta = 0;
- ll bestb = 0;
- for (int i = 0; i < adj[v].size(); ++i) {
- int u = adj[v][i];
- if (u == p || partcyc[u]) continue;
- calc(u, v);
- tl[v] = max(tl[v], tl[u] + len[u]);
- ll temp = tl[u] + len[u];
- if (temp > besta) swap(besta, temp);
- if (temp > bestb) bestb = temp;
- }
- ret = max(ret, besta + bestb);
- }
- inline ll solve (int v) {
- int start = -1;
- while (!vis[v]) {
- vis[v] = true;
- v = nxt[v];
- }
- ret = 0;
- start = v;
- ll csum = len[v];
- partcyc[v] = true;
- v = nxt[v];
- while (v != start) {
- //cout << v << '\n';
- csum += len[v];
- partcyc[v] = true;
- v = nxt[v];
- }
- //cout << start << ' ';
- calc(v, - 1);
- v = nxt[v];
- while (v != start) {
- calc(v, -1);
- v = nxt[v];
- }
- ll x = tl[start];
- ll y = tl[start] + csum - len[start];
- v = start;
- x += len[v];
- v = nxt[v];
- for (; v != start; v = nxt[v]) {
- ret = max(ret, x + tl[v]);
- ret = max(ret, y + tl[v]);
- x = max(x, tl[v]);
- y = max(y, tl[v] + csum);
- x += len[v];
- y -= len[v];
- }
- //cout << ret << '\n';
- return ret;
- }
- int main(){
- csl;
- if (JUDGE) {
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- }
- cin >> n;
- for (int i = 1; i <= n; ++i) {
- cin >> v >> c;
- u = i;
- nxt[i] = v;
- len[i] = c;
- adj[v].push_back(u);
- }
- for (int i = 1; i <= n; ++i) {
- if (!vis[i]) ans += solve(i);
- }
- cout << ans << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement