제출 #593314

#제출 시각아이디문제언어결과실행 시간메모리
593314Bench0310Salesman (IOI09_salesman)C++17
33 / 100
659 ms32664 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N=500001;
int mvl,mvr;
int tlee[4*N]; //left endpoint
int tree[4*N]; //right endpoint
array<int,3> fairs[N];
int best[N];

void update(int idx,int l,int r,int pos,int val)
{
    if(l==r)
    {
        tlee[idx]=val-mvr*l;
        tree[idx]=val+mvl*l;
    }
    else
    {
        int m=(l+r)/2;
        if(pos<=m) update(2*idx,l,m,pos,val);
        else update(2*idx+1,m+1,r,pos,val);
        tlee[idx]=max(tlee[2*idx],tlee[2*idx+1]);
        tree[idx]=max(tree[2*idx],tree[2*idx+1]);
    }
}

int query(int idx,int l,int r,int ql,int qr,int t)
{
    if(ql>qr) return -(1<<30);
    if(l==ql&&r==qr) return (t==0?tlee[idx]:tree[idx]);
    int m=(l+r)/2;
    return max(query(2*idx,l,m,ql,min(qr,m),t),query(2*idx+1,m+1,r,max(ql,m+1),qr,t));
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    memset(tlee,128,sizeof(tlee));
    memset(tree,128,sizeof(tree));
    int n,s;
    cin >> n >> mvl >> mvr >> s;
    mvl=-mvl; mvr=-mvr;
    for(int i=0;i<n;i++) for(int j=0;j<3;j++) cin >> fairs[i][j];
    sort(fairs,fairs+n);
    update(1,1,N,s,0);
    auto getopt=[&](int p)->int
    {
        return max(query(1,1,N,1,p,0)+mvr*p,query(1,1,N,p,N,1)-mvl*p);
    };
    auto chmax=[&](int &a,int b){a=max(a,b);};
    int tl=0;
    while(tl<n)
    {
        int tr=tl;
        while(tr+1<n&&fairs[tr+1][0]==fairs[tl][0]) tr++;
        int opt=-(1<<30);
        for(int i=tl;i<=tr;i++)
        {
            auto [t,p,c]=fairs[i];
            int now=max(getopt(p),opt+mvr*p)+c;
            chmax(best[i],now);
            chmax(opt,now-mvr*p);
        }
        opt=-(1<<30);
        for(int i=tr;i>=tl;i--)
        {
            auto [t,p,c]=fairs[i];
            int now=max(getopt(p),opt-mvl*p)+c;
            chmax(best[i],now);
            chmax(opt,now+mvl*p);
        }
        for(int i=tl;i<=tr;i++) update(1,1,N,fairs[i][1],best[i]);
        tl=tr+1;
    }
    cout << getopt(s) << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...