Submission #1175198

#TimeUsernameProblemLanguageResultExecution timeMemory
1175198thangdz2k7Salesman (IOI09_salesman)C++20
0 / 100
157 ms39580 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAX = 5e5 + 5;
const int INF = 1e14 + 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][2], suff[MAX][2];

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

int Maxp[MAX], Maxs[MAX];

void update(int p, int v1, int v2){
    for (int i = p; i < MAX; i += i & -i)
        Maxp[i] = max(Maxp[i], v1);

    for (int i = p; i; i -= i & -i)
        Maxs[i] = max(Maxs[i], v2);
}

int getp(int p){
    int ans = -INF;
    for (int i = p; i; i -= i & -i)
        ans = max(ans, Maxp[i]);

    return ans;
}

int gets(int p){
    int ans = -INF;
    for (int i = p; i < MAX; i += i & -i)
        ans = max(ans, Maxs[i]);

    return ans;
}

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);

    for (int i = 0; i < MAX; ++ i){
        Maxp[i] = -INF;
        Maxs[i] = -INF;
    }

    dp[0] = 0;
    update(busi[0].l, busi[0].l * d, -busi[0].l * u);
    int ans = 0;

    for (int i = 1; i <= n; ++ i){
        int j;
        for (j = i; j <= n && busi[i].t == busi[j].t; ++ j){
            dp[j] = 0;
            dp[j] = max(dp[j], getp(busi[j].l) - busi[j].l * d + busi[j].m);
            dp[j] = max(dp[j], gets(busi[j].l) + busi[j].l * u + busi[j].m);
        }

        j --;

        pref[i][0] = dp[i];
        pref[i][1] = dp[i];
        for (int k = i + 1; k <= j; ++ k){
            for (int t : {0, 1}){
                int tmp = pref[k - 1][t] + busi[k].m - dist(busi[k - 1].l, busi[k].l);
                if (!t) tmp -= dist(busi[k].l, busi[k - 1].l);
                pref[k][t] = max(dp[k], tmp);
            }

            pref[k][1] = max(pref[k][0], pref[k][1]);
        }

        suff[j][0] = dp[j];
        suff[j][1] = dp[j];
        for (int k = j - 1; k >= i; -- k){
            for (int t : {0, 1}){
                int tmp = suff[k + 1][t] + busi[k].m - dist(busi[k + 1].l, busi[k].l);
                if (!t) tmp -= dist(busi[k].l, busi[k + 1].l);
                suff[k][t] = max(dp[k], tmp);
            }
            suff[k][1] = max(suff[k][1], suff[k][0]);
        }

        for (int k = i; k <= j; ++ k){
            int tmp = max(pref[k][1] + suff[k][0] - busi[k].m, pref[k][0] + suff[k][1] - busi[k].m);
            dp[k] = max({pref[k][1], suff[k][1], tmp});
            update(busi[k].l, dp[k] + busi[k].l * d, dp[k] - busi[k].l * u);
            ans = max(ans, dp[k] - dist(busi[k].l, busi[0].l));
        }

        i = j;
    }

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

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

    process();
    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...