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>
using namespace std;
#define N 1000100
#define ll long long
int deg[N];
#define ck(a,b) a=max(a,b)
#define Ck(a,b,c) a=max({a,b,c})
ll v[N], l[N], O[N], I[N];
ll solve(int x) {
ll mx1=O[x],mx2=O[x],sum=l[x],ans1=I[x],ans2=-1e18;
for(int y=v[x];y-x;sum+=l[y],deg[y]=0,y=v[y]) {
Ck(ans1,O[y]+sum+mx1,I[y]);
ck(ans2,O[y]-sum+mx2);
ck(mx1,O[y]-sum);
ck(mx2,O[y]+sum);
}
return max(ans1,ans2+sum);
}
int main() {
cin.sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i]>>l[i],deg[v[i]]++;
queue<int> q;
for(int i=1;i<=n;i++)
if(!deg[i])q.push(i);
while (q.size()) {
int x=q.front(),y=v[x];
q.pop();
Ck(I[y],O[y]+O[x]+l[x],I[x]);
ck(O[y],O[x]+l[x]);
if(!--deg[y])q.push(y);
}
ll ans=0;
for(int i=1;i<=n;i++)
if(deg[i])
ans+=solve(i),deg[i]=0;
cout<<ans;
}
# | 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... |