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<bits/stdc++.h>
#define f first
#define s second
using namespace std;
const int N=1e6+5;
long long mx,h,ans1,dm[N],n,m,a[N],b[N],fix[N],sz,mx1,c,k,u,ans,v;
vector<pair<int,long long> >V[N],cycle;
void dfs(int u,int p,long long h,int S){
if(!fix[u])fix[u]=1;
if(h>mx) {
mx=h; c=u;
}
for(int i=0;i<V[u].size();i++){
if((fix[V[u][i].f]!=2 || V[u][i].f==u) && V[u][i].f!=p){
dfs(V[u][i].f,u,h+V[u][i].s,S);
}
}
}
void diameter(int u){
mx=0;
dfs(u,0,0,u);dm[u]=mx;
dfs(c,0,0,u);
ans1=max(ans1,mx);
}
int main(){
cin>>n;
for(k=1;k<=n;k++){
cin>>a[k]>>b[k];
V[a[k]].push_back({k,b[k]});
V[k].push_back({a[k],b[k]});
}
for(k=1;k<=n;k++){
if(!fix[k]){
u=k;
ans1=0; sz=0; cycle.clear();
while(!fix[u]){
fix[u]=1;
u=a[u];
}
while(fix[u]!=2){
fix[u]=2;
u=a[u];
cycle.push_back({u,b[u]});
sz+=b[u];
}
for(int i=0;i<cycle.size();i++){
diameter(cycle[i].f);
}
mx=mx1=dm[cycle[0].f]; ans1=max(ans1,sz-cycle[0].s);
long long bef=cycle[0].s;
for(int i=1;i<cycle.size();i++){
ans1=max(ans1,bef+mx+dm[cycle[i].f]);
ans1=max(ans1,sz+mx1-bef+dm[cycle[i].f]);
mx=max(mx,dm[cycle[i].f]-bef);
mx1=max(mx1,dm[cycle[i].f]+bef);
bef+=cycle[i].s;
}
ans+=ans1;
}
}
cout<<ans;
}
Compilation message (stderr)
islands.cpp: In function 'void dfs(int, int, long long int, int)':
islands.cpp:13:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
13 | for(int i=0;i<V[u].size();i++){
| ~^~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:46:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
46 | for(int i=0;i<cycle.size();i++){
| ~^~~~~~~~~~~~~
islands.cpp:51:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
51 | for(int i=1;i<cycle.size();i++){
| ~^~~~~~~~~~~~~
# | 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... |