#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,u,w,vis[3000005],no[3000005],is[3000005];
int pt,done,cycle[3000005],bck[3000005],mx,ans;
int node,dist,dp[3000005],par[3000005],we[3000005];
vector<pair<int,int>> g[3000005];
void dfs(int x,int p){
if (done) return;
if (vis[x]){
int cnt=0;
for (auto i:g[x]) cnt+=i.first==p;
if (cnt==2){
cycle[++pt]=x;
cycle[++pt]=p;
is[x]=true; is[p]=true;
}
else {
while (p!=x){
is[p]=true;
cycle[++pt]=p;
p=bck[p];
if (p==-1) break;
}
is[x]=true; cycle[++pt]=x;
}
done=true;
}
else {
vis[x]=1; bck[x]=p;
for (auto i:g[x]){
if (i.first!=p) dfs(i.first,x);
}
}
}
void mem(int x){
no[x]=1;
for (auto i:g[x]){
if (!no[i.first]) mem(i.first);
}
}
void dfs1(int x,int p,int d){
if (d>dist) {
node=x; dist=d;
}
for (auto i:g[x]) {
if (i.first!=p && !is[i.first]) dfs1(i.first,x,d+i.second);
}
}
void treedp(int x,int p){
for (auto i:g[x]){
if (is[i.first] || i.first==p) continue;
treedp(i.first,x);
}
for (auto i:g[x]){
if (is[i.first] || i.first==p) continue;
dp[x]=max(dp[x],dp[i.first]+i.second);
}
}
int weight(int x,int tar){
for (auto i:g[x]) if (i.first==tar) return i.second;
return 0;
}
void work(){
int sum=0;
priority_queue<pair<int,int>> q;
for (int i=2;i<=pt;i++) we[i]=we[i+pt]=weight(cycle[i-1],cycle[i]);
we[pt+1]=weight(cycle[pt],cycle[1]);
for (int i=1;i<=2*pt;i++) par[i]=par[i-1]+we[i];
for (int i=2;i<=pt;i++) q.push({par[i]+dp[cycle[i]],i});
for (int i=1;i<=pt;i++){
while (!q.empty() && q.top().second<=i) q.pop();
if (!q.empty()) mx=max(mx,q.top().first+dp[cycle[i]]-sum);
// cout<<i<<" "<<q.top().first+dp[cycle[i]]-sum<<"\n";
sum+=we[i+1]; q.push({par[pt+i]-par[i+1]+dp[cycle[i]]+sum,pt+i});
}
}
signed main(){
cin>>n;
for (int i=1;i<=n;i++){
cin>>u>>w;
g[i].push_back({u,w});
g[u].push_back({i,w});
bck[i]=-1;
}
for (int i=1;i<=n;i++){
if (no[i]) continue;
node=mx=dist=done=pt=0;
dfs(i,-1); mem(i);
if (done){
for (int j=1;j<=pt;j++){
treedp(cycle[j],-1);
for (auto k:g[cycle[j]]){
if (is[k.first]) continue;
node=dist=0;
dfs1(k.first,-1,0);
dfs1(node,-1,0);
mx=max(mx,dist);
}
}
if (pt==2){
int tmp=0;
for (auto j:g[cycle[1]]){
if (j.first==cycle[2]) tmp=max(tmp,j.second);
}
mx=max(mx,dp[cycle[1]]+dp[cycle[2]]+tmp);
}
else {
work();
reverse(cycle+1,cycle+1+pt);
work();
}
}
else {
dfs1(i,-1,0);
dfs1(node,-1,0);
mx=max(mx,dist);
}
// cout<<mx<<"\n";
ans+=mx;
}
cout<<ans<<"\n";
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
70764 KB |
Output is correct |
2 |
Correct |
40 ms |
70716 KB |
Output is correct |
3 |
Correct |
36 ms |
70800 KB |
Output is correct |
4 |
Correct |
37 ms |
70712 KB |
Output is correct |
5 |
Correct |
35 ms |
70696 KB |
Output is correct |
6 |
Correct |
37 ms |
70676 KB |
Output is correct |
7 |
Correct |
37 ms |
70740 KB |
Output is correct |
8 |
Correct |
40 ms |
70736 KB |
Output is correct |
9 |
Correct |
37 ms |
70732 KB |
Output is correct |
10 |
Incorrect |
42 ms |
70780 KB |
Output isn't correct |
11 |
Correct |
38 ms |
70732 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
70840 KB |
Output is correct |
2 |
Correct |
38 ms |
70916 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
38 ms |
70988 KB |
Output is correct |
2 |
Correct |
40 ms |
71360 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
61 ms |
72564 KB |
Output is correct |
2 |
Correct |
71 ms |
76272 KB |
Output is correct |
3 |
Correct |
55 ms |
72660 KB |
Output is correct |
4 |
Correct |
44 ms |
71724 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
82 ms |
78624 KB |
Output is correct |
2 |
Correct |
119 ms |
81636 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
187 ms |
92084 KB |
Output is correct |
2 |
Correct |
209 ms |
101244 KB |
Output is correct |
3 |
Correct |
280 ms |
119784 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
348 ms |
107792 KB |
Output is correct |
2 |
Runtime error |
357 ms |
131072 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
721 ms |
131072 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
730 ms |
131072 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |