展翅翱翔之时 (はばたきのとき)

来源:互联网 发布:airplay软件下载 编辑:程序博客网 时间:2024/05/08 17:01
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 100000;
int A[MAXN];
long long C[MAXN];
int b[MAXN];

int main() {
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i++) {
        cin >> A[i] >> C[i];
        A[i]--;
    }
    for (int i = 0; i < n; i++) {
        b[i] = -1;
    }
    bool F = 0;
    for (int i = 0; i < n; i++) {
        if (b[i] != -1) {
            continue;
        }
        int j = i;
        while (b[j] == -1) {
            b[j] = i;
            j = A[j];
        }
        if (b[j] == i) {
            int C = 0;
            while (b[j] != -2) {
                b[j] = -2;
                j = A[j];
                C++;
            }
            if (C == n) {
                F = 1;
            }
        }
    }
    long long ans = 0ll;
    if (!F) {
        for (int i = 0; i < n; i++) {
            ans += C[i];
        }
        static long long M1[MAXN] = {0}, M2[MAXN] = {0};
        for (int i = 0; i < n; i++) {
            M1[A[i]] = max(M1[A[i]], C[i]);
            if (b[i] != -2) {
                M2[A[i]] = max(M2[A[i]], C[i]);
            }
        }
        for (int i = 0; i < n; i++) {
            ans -= M1[i];
        }
        for (int i = 0; i < n; i++) {
            if (b[i] != -2) {
                continue;
            }
            long long M = 10000000000ll;
            int j = i;
            while (b[j] == -2) {
                M = min(M, M1[j] - M2[j]);
                b[j] = -3;
                j = A[j];
            }
            ans += M;
        }
    }
    cout << ans << endl;
    return 0;
}
0 0
原创粉丝点击