Submission #985558

#TimeUsernameProblemLanguageResultExecution timeMemory
985558maomao90Tower (JOI24_tower)C++17
100 / 100
111 ms17800 KiB

// Hallelujah, praise the one who set me free
// Hallelujah, death has lost its grip on me
// You have broken every chain, There's salvation in your name
// Jesus Christ, my living hope
#include <bits/stdc++.h> 
using namespace std;

#define REP(i, s, e) for (int i = (s); i < (e); i++)
#define RREP(i, s, e) for (int i = (s); i >= (e); i--)
template <class T>
inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;}
template <class T>
inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;}

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
#define ALL(_a) _a.begin(), _a.end()
#define SZ(_a) (int) _a.size()
#define pb push_back
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;
typedef vector<iii> viii;

#ifndef DEBUG
#define cerr if (0) cerr
#endif

const int INF = 1000000005;
const ll LINF = 1000000000000000005ll;
const int MAXN = 200005;

int n, q;
ll d, a, b;
ll l[MAXN], r[MAXN];
pll x[MAXN];
deque<pll> dq;
ll ans[MAXN];

int main() {
#ifndef DEBUG
    ios::sync_with_stdio(0), cin.tie(0);
#endif
    cin >> n >> q;
    cin >> d >> a >> b;
    REP (i, 0, n) {
        cin >> l[i] >> r[i];
    }
    l[n] = LINF;
    REP (i, 0, q) {
        cin >> x[i].FI;
        x[i].SE = i;
        ans[i] = LINF;
    }
    sort(x, x + q);
    int mnq = 0, mxq = 0;
    dq.pb({0, l[0] - 1});
    int ptr = 0;
    ll jcnt = 0;
    auto cost = [&] (int id, ll jcnt) {
        mnto(ans[x[id].SE], (x[id].FI - jcnt * d) * a + jcnt * b);
    };
    auto cutfront = [&] (ll bnd) {
        while (!dq.empty() && dq.front().FI < bnd) {
            while (mxq < q && x[mxq].FI <= min(bnd - 1, dq.front().SE)) {
                if (x[mxq].FI >= dq.front().FI) {
                    cost(mxq, jcnt - 1);
                }
                mxq++;
            }
            dq.front().FI = bnd;
            if (dq.front().FI > dq.front().SE) {
                dq.pop_front();
                ptr = max(0, ptr - 1);
            }
        }
    };
    while (mnq < q && x[mnq].FI < l[0]) {
        cost(mnq++, jcnt);
    }
    int lptr = 0, rptr = 0;
    while (mxq < q && !dq.empty() && rptr < n) {
        ++jcnt;
        ll bnd = dq.back().SE + d;
        bool delta = 0;
        while (rptr < n && bnd >= r[rptr] + 1) {
            delta = 1;
            while (ptr < SZ(dq) && dq[ptr].FI <= r[rptr] + 1 - d) {
                ptr++;
            }
            ll lo = LINF;
            if (ptr && dq[ptr - 1].SE >= r[rptr] + 1 - d) {
                lo = r[rptr] + 1;
                dq.pb({lo, l[rptr + 1] - 1});
            } else if (dq[ptr].FI + d < l[rptr + 1]) {
                lo = dq[ptr].FI + d;
                dq.pb({lo, l[rptr + 1] - 1});
            }
            rptr++;
            while (mnq < q && x[mnq].FI < l[rptr]) {
                if (x[mnq].FI >= lo) {
                    cost(mnq, jcnt);
                }
                mnq++;
            }
        }
        cutfront(dq.front().FI + d);
        if (!delta) {
            break;
        }
    }
    while (mxq < q && !dq.empty()) {
        while (mxq < q && x[mxq].FI < dq.front().FI) {
            mxq++;
        }
        if (mxq == q) {
            break;
        }
        ll need;
        if (x[mxq].FI <= dq.front().SE) {
            // dq.front().FI + need * d >= x[mxq].FI
            // need >= (x[mxq].FI - dq.front().FI) / d
            need = (x[mxq].FI - dq.front().FI + d) / d;
        } else {
            need = (dq.front().SE - dq.front().FI + d) / d;
        }
        jcnt += need;
        cutfront(dq.front().FI + need * d);
    }
    REP (i, 0, q) {
        cout << (ans[i] == LINF ? -1 : ans[i]) << '\n';
    }
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:88:9: warning: unused variable 'lptr' [-Wunused-variable]
   88 |     int lptr = 0, rptr = 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...