제출 #432962

#제출 시각아이디문제언어결과실행 시간메모리
432962jhnah917Salesman (IOI09_salesman)C++14
100 / 100
733 ms37992 KiB
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
using PII = pair<int, int>;

constexpr int SZ = 1 << 19;
struct SegmentTree{
    int T[SZ << 1];
    SegmentTree(){ memset(T, 0xc0, sizeof T); }
    void update(int x, int v){
        x |= SZ; T[x] = max(T[x], v);
        while(x >>= 1) T[x] = max(T[x], v);
    }
    int query(int l, int r){
        l |= SZ; r |= SZ; int ret = T[0];
        while(l <= r){
            if(l & 1) ret = max(ret, T[l++]);
            if(~r & 1) ret = max(ret, T[r--]);
            l >>= 1; r >>= 1;
        }
        return ret;
    }
};

struct Info{
    int t, l, m; // time, location, money
    bool operator < (const Info &info) const {
        return t < info.t;
    }
};

int N, U, D, S, DP[505050];
vector<PII> A[505050];

SegmentTree T_D, T_U;

void Update(int pos, int dp){
    T_D.update(pos, dp + D * pos);
    T_U.update(pos, dp - U * pos);
}

int Query(int pos, int money){
    int dw = T_D.query(0, pos) - D * pos + money;
    int up = T_U.query(pos, 505050) + U * pos + money;
    return max(dw, up);
}

void SolveTime(int ti){
    if(A[ti].empty()) return;
    int len = A[ti].size();

    vector<int> DL(len), DR(len);
    for(int i=0; i<len; i++){
        DL[i] = DR[i] = Query(A[ti][i].x, A[ti][i].y);
    }
    for(int i=len-2; i>=0; i--){
        DL[i] = max(DL[i], DL[i+1] - U * (A[ti][i+1].x - A[ti][i].x) + A[ti][i].y);
    }
    for(int i=1; i<len; i++){
        DR[i] = max(DR[i], DR[i-1] - D * (A[ti][i].x - A[ti][i-1].x) + A[ti][i].y);
    }
    for(int i=0; i<len; i++){
        int res = max(DL[i], DR[i]);
        Update(A[ti][i].x, res);
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    cin >> N >> U >> D >> S;
    int sz = 0;
    for(int i=1; i<=N; i++){
        int t, l, m; cin >> t >> l >> m;
        A[t].emplace_back(l, m);
        sz = max(sz, t);
    }
    A[0].emplace_back(S, 0);    // start
    A[++sz].emplace_back(S, 0); // end
    for(int i=0; i<=sz; i++) sort(A[i].begin(), A[i].end());

    memset(DP, 0xc0, sizeof DP);
    DP[0] = 0; Update(S, 0);
    for(int i=1; i<=sz; i++) SolveTime(i);
    cout << Query(S, 0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...