제출 #1159236

#제출 시각아이디문제언어결과실행 시간메모리
1159236OI_AccountLong Distance Coach (JOI17_coach)C++20
100 / 100
94 ms21168 KiB
#include <bits/stdc++.h>
using namespace std;

#define M first
#define B second

typedef long long ll;
typedef pair<ll, ll> line;

const int N = 200'000;

ll x, n, m, w, t, s[N + 10];
ll d[N + 10], c[N + 10];
pair<ll, ll> p[N + 10];
ll a[N + 10], dp[N + 10], all[N + 10];
ll sum[N + 10], f[N + 10];

void readInput() {
    cin >> x >> n >> m >> w >> t;
    for (int i = 1; i <= n; i++)
        cin >> s[i];
    for (int i = 1; i <= m; i++)
        cin >> p[i].first >> p[i].second;
}

void initInput() {
    sort(s + 1, s + n + 1);
    sort(p + 1, p + m + 1);
    for (int i = 1; i <= m; i++) {
        d[i] = p[i].first;
        c[i] = p[i].second;
    }
}

void calcA() {
    for (int i = 1; i <= m; i++)
        a[i] = -1;
    for (int i = 0; i <= n; i++) {
        ll nxt = (i == n? x: s[i + 1]);
        int idx = lower_bound(d + 1, d + m + 1, nxt % t) - d;
        if (idx != 1 && a[idx - 1] == -1)
            a[idx - 1] = (nxt - 1) / t;
    }
}

void calcAll() {
    for (int i = 1; i <= m; i++)
        all[i] = x / t + (d[i] < x % t);
    all[0] = x / t + 1;
}

void calcSum() {
    for (int i = 1; i <= m; i++)
        sum[i] = sum[i - 1] + c[i];
}

vector<pair<ll, line>> vec;

ll getVal(line l, ll x) {
    return l.B + x * l.M;
}

ll getIdx(line l1, line l2) {
    return (l2.B - l1.B + (l1.M - l2.M - 1)) / (l1.M - l2.M);
}

void addLine(line l) {
    while (!vec.empty()) {
        ll val1 = getVal(vec.back().second, vec.back().first);
        ll val2 = getVal(l, vec.back().first);
        if (val1 <= val2)
            vec.pop_back();
        else
            break;
    }
    if (vec.empty())
        vec.push_back({0, l});
    else {
        line l2 = vec.back().second;
        vec.push_back({getIdx(l, l2), l});
    }
}

ll getMax(ll x) {
    int idx = upper_bound(vec.begin(), vec.end(), make_pair(x + 1, line(-1, -1))) - vec.begin();
    return getVal(vec[idx - 1].second, x);
}

void calcDP() {
    vec.push_back({0, line(0, 0)});
    for (int i = 1; i <= m; i++) {
        dp[i] = all[i] * w + dp[i - 1];
        if (a[i] != -1) {
            ll case2 = getMax(a[i] * w);
            dp[i] = min(dp[i], sum[i] + a[i] * w * i - case2);
        }
        f[i] = dp[i] - sum[i];
        addLine(line(i, -f[i]));
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    readInput();
    initInput();
    calcA();
    calcAll();
    calcSum();
    calcDP();
    cout << dp[m] + all[0] * w << flush;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...