蒟蒻20pts求调
查看原帖
蒟蒻20pts求调
700106
Xdik楼主2023/5/16 16:58
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k, d[10005], s[10005], t[10005], e[10005], f[10005], ld[10005], gt[10005], x[10005];
signed main() {
    cin >> n >> m >> k;
    for (int i = 1; i < n; i++) cin >> d[i];
    for (int i = 1; i <= m; i++) {
        cin >> t[i] >> s[i] >> e[i];
        ld[s[i]] = max(ld[s[i]], t[i]);
        x[e[i]]++;
    }
    int ans = 0;
    for (int i = 2; i <= n; i++) {
        gt[i] = max(gt[i - 1], ld[i - 1]) + d[i - 1];
    }
    for (int i = 1; i <= m; i++) {
        ans += gt[e[i]] - t[i];
    }
    for (int i = n - 1; i >= 1; i--) {
        if (gt[i + 1] > ld[i + 1])
            f[i] = f[i + 1] + x[i + 1];
        else
            f[i] = 0;
    }
    while (k--) {
        int mx = 0;
        for (int i = 1; i <= n - 1; i++) {
            if (f[mx] < f[i])
                mx = i;
        }
        if (!mx)
            break;
        ans -= f[mx];
        d[mx]--;
        for (int i = mx - 1; i <= n; i++) {
            gt[i] = max(gt[i - 1], ld[i - 1]) + d[i - 1];
        }
        for (int i = n - 1; i >= mx; i--) {
            if (d[i] == 0)
                f[i] = 0;
            else if (gt[i + 1] > ld[i + 1])
                f[i] = f[i + 1] + x[i + 1];
            else
                f[i] = 0;
        }
    }
    cout << ans;
    return 0;
}
2023/5/16 16:58
加载中...