Submission #1175186

#TimeUsernameProblemLanguageResultExecution timeMemory
1175186thangdz2k7Salesman (IOI09_salesman)C++20
9 / 100
3095 ms7264 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX = 5e5 + 5;
const int INF = 2e9 + 1;

int n, u, d;

struct info{
    int t, l, m;

    info(){
        t = l = m = 0;
    }

    bool operator < (const info &o) const {
        if (t == o.t) return l < o.l;
        return t < o.t;
    }

} busi[MAX];

int dp[MAX], pref[MAX], suff[MAX];

int dist(int fr, int to){
    if (fr < to) return d * (to - fr);
    return u * (fr - to);
}

void process(){
    cin >> n >> u >> d >> busi[0].l;

    for (int i = 1; i <= n; ++ i)
        cin >> busi[i].t >> busi[i].l >> busi[i].m;

    sort(busi, busi + n + 1);

    dp[0] = 0;
    int ans = 0;

    for (int i = 1; i <= n; ++ i){
        int j;
        for (j = i; j <= n && busi[i].t == busi[j].t; ++ j){
            for (int k = 0; k < i; ++ k)
                dp[j] = max(dp[j], dp[k] + busi[j].m - dist(busi[k].l, busi[j].l));
        }

        j --;

        pref[i] = dp[i];
        for (int k = i + 1; k <= j; ++ k)
            pref[k] = max(dp[k], pref[k - 1] + busi[k].m - dist(busi[k - 1].l, busi[k].l));

        suff[j] = dp[j];
        for (int k = j - 1; k >= i; -- k)
            suff[k] = max(dp[k], suff[k + 1] + busi[k].m - dist(busi[k + 1].l, busi[k].l));

        for (int k = i; k <= j; ++ k){
            dp[k] = max(pref[k], suff[k]);
            ans = max(ans, dp[k] - dist(busi[k].l, busi[0].l));
        }

        i = j;
    }

    cout << ans << "\n";
}

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

    process();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...