제출 #1313936

#제출 시각아이디문제언어결과실행 시간메모리
1313936SofiatpcIslands (IOI08_islands)C++20
100 / 100
629 ms117140 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int MAXN = 1e6+5;
vector<int> adj[MAXN];
int f[MAXN], w[MAXN], in[MAXN], marc[MAXN];
ll mx[2][MAXN], ansc[MAXN],comp;

void dfs(int s){
    marc[s] = 1;
    comp = max({comp, ansc[s], mx[0][s]+mx[1][s]});
    for(int viz : adj[s])
        if(!marc[viz])dfs(viz);
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n; cin>>n;
    for(int i = 1; i <= n; i++){
        cin>>f[i]>>w[i];
        in[f[i]]++;
        adj[i].push_back(f[i]);
        adj[f[i]].push_back(i);
    }

    queue<int> q;
    for(int i = 1; i <= n; i++)
        if(in[i] == 0)q.push(i);
    
    while(!q.empty()){
        int x = q.front(); q.pop();
        in[ f[x] ]--; if(in[f[x]] == 0)q.push(f[x]);

        if(mx[0][f[x]] < mx[0][x] + w[x]){
            mx[1][f[x]] = mx[0][f[x]];
            mx[0][f[x]] = mx[0][x] + w[x];
        }else if(mx[1][f[x]] < mx[0][x] + w[x])mx[1][f[x]] = mx[0][x] + w[x];
    }
    
    for(int i = 1; i <= n; i++)
        if(in[i] == 1 && marc[i] == 0){
            int cur = i; ll tot = 0;
            while(1){
                marc[cur] = 1;
                tot += w[cur];
                cur = f[cur];
                if(cur == i)break;
            }

            ll x = 0, y = 0, d = 0; cur = i;
            while(1){
                if(cur != i){
                    ansc[cur] = max(x + mx[0][cur]+d, y + mx[0][cur]-d+tot);
                    x = max(x, mx[0][cur]-d);
                    y = max(y, mx[0][cur]+d);
                }else{
                    x = mx[0][cur]-d;
                    y = mx[0][cur]+d;
                }

                d += w[cur]; cur = f[cur]; 
                if(cur == i)break;
            }
        }

    for(int i = 1; i <= n; i++)marc[i] = 0;

    ll ans = 0;
    for(int i = 1; i <= n; i++)
        if(!marc[i]){
            comp = 0;
            dfs(i);
            ans += comp;
        }

    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...