Submission #1348606

#TimeUsernameProblemLanguageResultExecution timeMemory
1348606warrennLong Distance Coach (JOI17_coach)C++20
0 / 100
0 ms348 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second

const int inf=1e18;

struct line{
    int m=inf,c;
    int y(int x){
        if(m==inf)return inf;
        return m*x+c;
    }
};

struct seg{
    int l,r;
    seg *lf=0,*rg=0;
    line opt;

    seg(int x,int y){
        l=x,r=y;
    }

    void update(line baru){
        if(opt.m==inf){
            opt=baru; return;
        }
        int mid=(l+r)/2;

        if(opt.y(mid)>baru.y(mid))swap(opt,baru);
        if(l==r)return;

        if(baru.m<opt.m){
            if(!rg)rg=new seg(mid+1,r);
            rg->update(baru);
        }
        else{
            if(!lf)lf=new seg(l,mid);
            lf->update(baru);
        }
    }

    int query(int x){
        int brp=opt.y(x);
        int mid=(l+r)/2;

        if(mid>=x){
            if(!lf);
            else brp=min(brp,lf->query(x));
        }
        else{
            if(!rg);
            else brp=min(brp,rg->query(x));
        }
        return brp;
    }
};

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int x,n,m,w,t;
    cin>>x>>n>>m>>w>>t;
    int s[n+2];
    for(int q=1;q<=n;q++)cin>>s[q];
    s[n+1]=x;
    sort(s+1,s+n+2);

    ii org[m+1];
    for(int q=1;q<=m;q++){
        cin>>org[q].fir>>org[q].sec;
    }
    sort(org+1,org+m+1);

    int v[m+1],pref[m+1]; pref[0]=0; 
    for(int q=0;q<=m;q++){
        v[q]=0;
        if(q>=1)pref[q]=pref[q-1]+org[q].sec;
    }

    for(int q=n+1;q>=1;q--){
        int idx=lower_bound(org+1,org+m+1,make_pair(s[q]%t,0LL))-org-1;
        v[idx]=s[q];
    }
    // for(int q=1;q<=m;q++)cout<<v[q]<<' ';
    // cout<<endl;

    seg slv(0,1e12);
    int ans=0;
    int dp[m+1]; dp[0]=0;
    slv.update({0,0});

    for(int q=1;q<=m;q++){
        dp[q]=dp[q-1]+((x-org[q].fir)/t +1)*w;
        //cout<<dp[q]<<' ';
        if(v[q]!=0){
            int brp=slv.query(v[q]/t) + pref[q] + (v[q]/t)*w*q;
            dp[q]=min(dp[q],brp);
            cout<<brp;
        }
        //cout<<endl;
        slv.update({-q*w,dp[q]-pref[q]});
    }

    dp[m]+=(x/t)*w; dp[m]+=w;
    cout<<dp[m]<<endl;
}

/*
dp[i]=dp[j]+(pref[i]-pref[j])+(i-j)*v[i]*w
m: -j*w
x:v[i]
c:dp[j]-pref[j]
k:pref[i]+i*v[i]*w
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...