Submission #1130776

#TimeUsernameProblemLanguageResultExecution timeMemory
1130776kmkmkmkmIslands (IOI08_islands)C++20
60 / 100
2095 ms9028 KiB
#include <bits/stdc++.h>
#define ss second
#define ff first
#define int long long
#define en '\n'
#define pb push_back
#define pii pair<int, int>
#define vi vector<int>
#define f(st, x, d) for (int i = st; i < x; i += d)
#define carray(x) for (auto k : x) cout << k << ' ';
#define all(x) begin(x), end(x)
using namespace std;

const int mod = 1e9 + 9;
const int N = 2e5 + 5;
const int INF = 1e9;
int f[N], w[N], g[N], a[N], deg[N], ans;

void solve() {
	int n;
    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] == 0) q.push(i);

    while (!q.empty()) {
        int p = q.front();

        int contribution = f[p] + w[p];
        g[a[p]] = max({g[a[p]], f[a[p]] + contribution, g[p]});

		if(f[a[p]] < contribution) f[a[p]] = contribution;
		deg[a[p]]--;
		q.pop();
        if (deg[a[p]] == 0) q.push(a[p]);
    }

    for (int i = 1; i <= n; i++) {
    	if (deg[i] > 0) {
    		int start = i, p = a[i];
			int max1 = f[start], max2 = f[start], sum = w[start], maxAns1 = g[start], maxAns2 = -1e18;
		    for (; p != start; p = a[p]) {
		        maxAns1 = max({maxAns1, g[p], f[p] + sum + max1});
		        maxAns2 = max(maxAns2, f[p] - sum + max2);
		        max1 = max(max1, f[p] - sum);
		        max2 = max(max2, f[p] + sum);
		        sum += w[p];
		        deg[p] = 0;
		    }
		    ans += max(maxAns1, maxAns2 + sum);
		}
	}

    cout << ans << '\n';
}
int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while (t--) solve();
    return 0;
}
#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...