Submission #998712

#TimeUsernameProblemLanguageResultExecution timeMemory
998712bachhoangxuanSalesman (IOI09_salesman)C++17
100 / 100
217 ms47456 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
const int maxn = 5e5+5;
const int inf = 1e18;
int N,D,U,S,T,M;
vector<pii> F[maxn];

struct BIT{
    int bit[maxn];
    BIT(){}
    void init(){
        for(int i=1;i<=M;i++) bit[i]=-inf;
    }
    void update(int x,int val){
        for(int i=x;i<=M;i+=(i&(-i))) bit[i]=max(bit[i],val);
    }
    int query(int x){
        int res=-inf;
        for(int i=x;i>=1;i-=(i&(-i))) res=max(res,bit[i]);
        return res;
    }
}lt,rt;

int d[maxn],mx[maxn];
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin >> N >> U >> D >> S;M=S;
    for(int i=1;i<=N;i++){
        int t,l,m;cin >> t >> l >> m;
        F[t].push_back({l,m});
        T=max(T,t);M=max(M,l);
    }
    lt.init();rt.init();
    lt.update(S,U*S);
    rt.update(M-S+1,-D*S);
    int res=0;
    for(int i=1;i<=T;i++){
        if(F[i].empty()) continue;
        sort(F[i].begin(),F[i].end());
        int sz=(int)F[i].size();
        for(int j=0;j<sz;j++){
            d[j]=max(lt.query(F[i][j].fi)-U*F[i][j].fi,rt.query(M-F[i][j].fi+1)+D*F[i][j].fi);

            mx[j]=d[j];
        }
        int v1=-inf,v2=-inf;
        for(int j=0;j<sz;j++){
            if(!j) v1=d[j]+F[i][j].se,v2=F[i][j].se;
            else{
                v2=max(v2-(U+D)*(F[i][j].fi-F[i][j-1].fi),0LL)+F[i][j].se;
                v1=max(v1-U*(F[i][j].fi-F[i][j-1].fi)+F[i][j].se,d[j]+v2);
            }
            mx[j]=max(mx[j],v1);
        }
        v1=-inf,v2=-inf;
        for(int j=sz-1;j>=0;j--){
            if(j==sz-1) v1=d[j]+F[i][j].se,v2=F[i][j].se;
            else{
                v2=max(v2-(U+D)*(F[i][j+1].fi-F[i][j].fi),0LL)+F[i][j].se;
                v1=max(v1-D*(F[i][j+1].fi-F[i][j].fi)+F[i][j].se,d[j]+v2);
            }
            mx[j]=max(mx[j],v1);
        }
        for(int j=0;j<sz;j++){
            if(F[i][j].fi>S) res=max(res,mx[j]-D*(F[i][j].fi-S));
            else res=max(res,mx[j]-U*(S-F[i][j].fi));
            //cout << F[i][j].fi << ' ' << F[i][j].se << ' ' << d[j] << ' ' << mx[j] << '\n';
            lt.update(F[i][j].fi,mx[j]+U*F[i][j].fi);
            rt.update(M-F[i][j].fi+1,mx[j]-D*F[i][j].fi);
        }
    }
    cout << res << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...