Submission #1140767

#TimeUsernameProblemLanguageResultExecution timeMemory
1140767pokmui9909Tower (JOI24_tower)C++17
0 / 100
106 ms27260 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define x first
#define y second

const ll INF = 2e18;
ll N, Q, D, A, B, S, L[200005], R[200005], Ans[200005];

struct Event{
    ll li, ri, lx, rx, t;
    bool operator<(const Event &k) const{
        if(li != k.li) return li < k.li;
        return ((t < 0 || k.t < 0) ? t > k.t : lx < k.lx);
    }
};

struct Naive{
    ll T[2500005] = {};
    void upd(ll l, ll r, ll v){
        for(ll i = l; i <= r; i++){
            T[i] = min(T[i], v);
			if(i > l) T[i] = min(T[i], T[i - 1]);
        }
    }
    void No(ll l, ll r){
        for(ll i = l; i <= r; i++){
            T[i] = INF;
        }
    }
    ll qry(ll k){
        return T[k];
    }
}seg;

int main(){
    cin.tie(0) -> sync_with_stdio(0);

    cin >> N >> Q >> D >> A >> B;
    vector<ll> Coord;
    for(ll i = 1; i <= N; i++){
        cin >> L[i] >> R[i];
    }
    R[0] = -1, L[N + 1] = 1e12 + 1;
    vector<Event> Ev;
    set<ll> chk;
    for(ll i = 1; i <= Q; i++){
        ll k; cin >> k;
        Ev.push_back({k / D, k / D, k % D, k % D, -i});
        Coord.push_back(k % D);
        chk.insert(k / D);
    }
	Coord.push_back(0);
    Coord.push_back(D - 1);
    for(ll i = 0; i <= N; i++){
        ll l = R[i] + 1, r = L[i + 1] - 1;
        Coord.push_back(l % D); Coord.push_back(r % D);
        if(l / D == r / D){
            Ev.push_back({l / D, l / D, l % D, r % D, 1});
        } else {
            Ev.push_back({l / D, l / D, l % D, D - 1, 1});
            Ev.push_back({r / D, r / D, 0, r % D, 1});

            if(r / D > l / D + 1){
                auto it = chk.lower_bound(l / D + 1);
                ll t = l / D + 1;
                while(it != chk.end()){
					if(*it >= r / D) break;
                    Ev.push_back({t, *it, 0, D - 1, 1});
                    t = *it + 1;
                    it = next(it);
                }
                if(t <= r / D - 1) Ev.push_back({t, r / D - 1, 0, D - 1, 1});
            }
        }
        
        if(i >= 1){
            l = L[i], r = R[i];
        	Coord.push_back(l % D); Coord.push_back(r % D);
            if(l / D == r / D){
                Ev.push_back({l / D, l / D, l % D, r % D, 0});
            } else {
                Ev.push_back({l / D, l / D, l % D, D - 1, 0});
                Ev.push_back({r / D, r / D, 0, r % D, 0});
				if(r / D > l / D + 1){
					auto it = chk.lower_bound(l / D + 1);
					ll t = l / D + 1;
					while(it != chk.end()){
						if(*it >= r / D) break;
						Ev.push_back({t, *it, 0, D - 1, 0});
						t = *it + 1;
						it = next(it);
					}
					if(t <= r / D - 1) Ev.push_back({t, r / D - 1, 0, D - 1, 0});
				}
            }
        }
    }
    sort(Ev.begin(), Ev.end());
    sort(Coord.begin(), Coord.end()); Coord.erase(unique(Coord.begin(), Coord.end()), Coord.end());
    for(auto &e : Ev){
        e.lx = lower_bound(Coord.begin(), Coord.end(), e.lx) - Coord.begin();
        e.rx = lower_bound(Coord.begin(), Coord.end(), e.rx) - Coord.begin();
    }
    S = Coord.size();
    ll Cur = 0;
    for(auto e : Ev){
        if(e.t == 0){
            seg.No(e.lx, e.rx);
        } else if(e.t == 1){
            if(e.li != e.ri){
                if(e.li != 0 && seg.qry(S - 1) != INF) seg.upd(0, S - 1, seg.qry(S - 1) + A * D - B);
                seg.upd(0, S - 1, seg.qry(0));
                Cur = e.ri;
            } else {
                if(e.lx == 0 & e.li != 0 && seg.qry(S - 1) != INF) seg.upd(e.lx, e.rx, seg.qry(S - 1) + A * D - B);
                seg.upd(e.lx, e.rx, seg.qry(e.lx));
                Cur = e.li;
            }
        } else {
            ll q = seg.qry(e.lx);
            Ans[-e.t] = (q >= INF ? -1 : q + A * Coord[e.lx] + B * e.li);
        }
    }
    for(ll i = 1; i <= Q; i++){
        cout << Ans[i] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...