#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
using ll = long long;
using ar2 = array<int,2>;
using vi = vector<int>;
const int mxN = (int)1e6+2;
ar2 nx[mxN];
bitset<mxN> cyc, vis;
vector<ar2> adj[mxN];
int n, allowed_S;
ll pref[mxN];
vi xd;
ar2 dfs2(int s){
ar2 ans = {0,s}; vis[s] = 1; xd.pb(s);
for(auto [u,w] : adj[s]){
if(vis[u]) continue;
auto [x,y] = dfs2(u);
ans = max(ans, {x+w,y});
}
return ans;
}
ll dfs(int s, int p){
ll ans = 0;
for(auto [u,w] : adj[s]){
if(u==p or cyc[u]) continue;
ans = max(ans, dfs(u,s)+w);
}
return ans;
}
ll compute_diam(int s){
allowed_S = s; xd.clear(); xd.shrink_to_fit();
int a = dfs2(s)[1];
for(auto u : xd) vis[u]=0; xd.clear(); xd.shrink_to_fit();
return dfs2(a)[0];
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n; ll ans = 0;
for(int i = 1; i <= n; i++){
int x, w; cin >> x >> w; nx[i]={x,w};
adj[x].pb({i,w}); adj[i].pb({x,w});
}
for(int i = 1; i <= n; i++){
if(vis[i]) continue;
int x = i; vi v; v.clear(); ll sum = 0;
while(!vis[x]) vis[x]=1,v.pb(x),x=nx[x][0];
for(auto u : v) vis[u]=0; v.clear();
while(!cyc[x]) cyc[x]=1,v.pb(x),x=nx[x][0];
for(auto u : v) sum = max(sum, compute_diam(u));
int m = sz(v); for(int i = 0; i < m; i++) v.pb(v[i]);
multiset<ll> S; S.clear();
for(int i = 0; i < m; i++){
ll dis = dfs(v[i],0);
pref[i+1]=pref[i]+(ll)nx[v[i]][1];
sum=max(sum,dis); S.insert(dis-pref[i]);
}
if(sz(v)>2){
for(int i = m; i < sz(v); i++){
ll dis = dfs(v[i],0);
S.erase(S.find(dis-pref[i-m]));
sum=max(sum, dis+pref[m]+pref[i-m]+*prev(end(S)));
S.insert(dis-(pref[m]+pref[i-m]));
}
}
ans+=sum;
}
cout << ans << "\n";
}
# | 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... |