Submission #211250

#TimeUsernameProblemLanguageResultExecution timeMemory
211250Alexa2001Long Distance Coach (JOI17_coach)C++17
100 / 100
197 ms18476 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf = 1e19;

const int Nmax = 2e5 + 5;
const ll eps = 1e-6;

int n, m, T, W, nr;
ll S[Nmax], P[Nmax];
int st[Nmax];

ll sumC[Nmax], need[Nmax], C[Nmax], dp[Nmax], sep[Nmax], coef[Nmax];
ll X;


void read()
{
    cin >> X >> n >> m >> W >> T;

    int i;
    for(i=1; i<=n; ++i) cin >> S[i];

    vector<pair<ll,int>> a(m+1);
    for(i=1; i<=m; ++i) cin >> a[i].first >> a[i].second;

    sort(a.begin() + 1, a.end());
    for(i=1; i<=m; ++i)
        P[i] = a[i].first, C[i] = a[i].second;
}

void prec()
{
    int i;
    for(i=1; i<=m; ++i)
    {
        sumC[i] = sumC[i-1] + C[i];
        need[i] = (X - P[i]) / T + 1;
    }

    for(i=1; i<=m; ++i) sep[i] = inf;

    S[++n] = X;
    for(i=1; i<=n; ++i)
    {
        int pos = lower_bound(P+1, P+m+1, S[i] % T) - P - 1;
        if(pos)
            sep[pos] = min<ll>(sep[pos], S[i] / T);
    }
}


namespace H
{
    static ll a[Nmax], b[Nmax];
    int nr = 0;

    long double meet(int x, int y)
    {
        return (long double) (b[x] - b[y]) / (a[y] - a[x]);
    }

    bool bad(int x, int y, int z)
    {
        return meet(x, y) - meet(y, z) < -eps;
    }

    void add(ll A, ll B)
    {
        a[0] = A; b[0] = B;
        while(nr >= 2 && bad(nr - 1, nr, 0)) --nr;
        a[++nr] = A; b[nr] = B;
        a[0] = b[0] = 0;
    }

    ll query(ll x)
    {
        int st = 1, dr = nr-1, mid;

        while(st <= dr)
        {
            mid = (st + dr) / 2;
            if(meet(mid, mid+1) - x > eps) st = mid + 1;
                else dr = mid - 1;
        }

        return a[st] * x + b[st];
    }
};

void solve()
{
    int i;

    H :: add(0, 0);

    for(i=1; i<=m; ++i)
    {
        dp[i] = dp[i-1] + need[i] * W;

        if(sep[i] != inf)
            dp[i] = min( dp[i], H :: query(-sep[i] * W) + sep[i] * i * W + sumC[i] );

        H :: add(i, dp[i] - sumC[i]);
    }

    cout << dp[m] + W * (X / T + 1) << '\n';
}

int main()
{
  //  freopen("input", "r", stdin);
   // freopen("output", "w", stdout);
    cin.sync_with_stdio(false); cin.tie(0);

    read();
    prec();
    solve();

    return 0;
}

Compilation message (stderr)

coach.cpp:6:16: warning: overflow in implicit constant conversion [-Woverflow]
 const ll inf = 1e19;
                ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...