Submission #875624

#TimeUsernameProblemLanguageResultExecution timeMemory
875624josanneo22Islands (IOI08_islands)C++17
100 / 100
263 ms53408 KiB
/*
Problem: P4381 [IOI2008] Island
When:    2023-11-19 19:41:26
Author:  Ning07
*/

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;

const int NN=2e6;
int N, A[NN], deg[NN];
i64 ans, f[NN], g[NN], W[NN];
i64 get(int p){
    int st=p; p=A[p];
    i64 m1=f[st],m2=f[st];
    i64 s=W[st],ans1=g[st],ans2=-1E18;
    while (p != st) {
        deg[p] = 0;
        ans1=max(ans1,max(g[p],f[p]+s+m1)); 
        ans2=max(ans2,f[p]-s+m2);
        m1=max(m1,f[p]-s),m2=max(m2,f[p]+s);
        s+=W[p],p=A[p];
    }
    return max(ans1,ans2+s);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>A[i]>>W[i]; 
        ++deg[A[i]];
    }
    queue<int> q;
    for(int i=1;i<=N;i++)
        if (!deg[i]) 
            q.push(i);

    while (!q.empty()){
        int p=q.front(); q.pop();
        i64 c=f[p]+W[p];
        g[A[p]]=max(g[A[p]],max(f[A[p]]+c,g[p]));
        f[A[p]]=max(f[A[p]],c);
        if (!--deg[A[p]]) q.push(A[p]);
    }

    for(int i=1;i<=N;i++)
        if (deg[i]) 
            ans += get(i);
    cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...