Submission #1149261

#TimeUsernameProblemLanguageResultExecution timeMemory
1149261anmattroi코알라 (JOI13_koala)C++17
100 / 100
68 ms5448 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define maxn 100005

using namespace std;
using ii = pair<int, int>;


int K, M, D, A, N;

int64_t dp[maxn];

ii a[maxn];

int64_t st[4*maxn];
int b[maxn], n1 = 0;

void upd(int u, int64_t d, int r = 1, int lo = 1, int hi = n1) {
    if (lo == hi) {
        st[r] = max(st[r], d);
        return;
    }
    int mid = (lo + hi) >> 1;
    if (u <= mid) upd(u, d, r<<1, lo, mid);
    else upd(u, d, r<<1|1, mid+1, hi);
    st[r] = max(st[r<<1], st[r<<1|1]);
}

int64_t get(int u, int v, int r = 1, int lo = 1, int hi = n1) {
    if (u > hi || v < lo) return LLONG_MIN/2;
    if (u <= lo && hi <= v) return st[r];
    int mid = (lo + hi) >> 1;
    return max(get(u, v, r<<1, lo, mid), get(u, v, r<<1|1, mid+1, hi));
}


void update(int pos, int64_t val) {
    int p = lower_bound(b + 1, b + n1 + 1, pos%D) - b;
    upd(p, val);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> K >> M >> D >> A >> N;

    b[++n1] = K%D; b[++n1] = M%D;
    for (int i = 1; i <= N; i++) {
        cin >> a[i].fi >> a[i].se;
        b[++n1] = a[i].fi%D;
    }
    sort(b + 1, b + n1 + 1);
    n1 = unique(b + 1, b + n1 + 1) - b - 1;
    for (int i = 1; i <= 4 * n1; i++) st[i] = LLONG_MIN/2;

    update(K, 1LL*(K/D)*A);

    a[++N] = {M, 0};

    for (int i = 1; i <= N; i++) {
        auto [T, B] = a[i];
        int p = lower_bound(b + 1, b + n1 + 1, T%D) - b;
        dp[i] = max(get(1, p) - A, get(p, n1)) - int64_t(1) * (T/D) * A + B;
        update(T, dp[i] + 1LL * (T/D) * A);
    }
    cout << dp[N];

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...