Submission #1140883

#TimeUsernameProblemLanguageResultExecution timeMemory
1140883pokmui9909Tower (JOI24_tower)C++17
63 / 100
1365 ms127392 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define x first
#define y second

const ll INF = 7e18, MAX_ANS = 1.5e18, FUCK = 9e18;
ll N, Q, D, A, B, S, L[200005], R[200005], Ans[200005];
set<ll> Mx;

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 SegTree{
	ll T[4500005], Rval[4500005], Lz[4500005];
	void upd(ll l, ll r, ll v) { upd(1, 1, S, l + 1, r + 1, v); }
	ll Go(ll l, ll r, ll v) { return Go(1, 1, S, l + 1, r + 1, v); }
	ll qry(ll l, ll r) { return qry(1, 1, S, l + 1, r + 1); }

	void prop(ll n, ll s, ll e){
		if(Lz[n] == FUCK) return;
		if(s != e){
			Lz[n * 2] = Lz[n * 2 + 1] = Lz[n];
		}
		T[n] = Rval[n] = Lz[n], Lz[n] = FUCK;
	}
	void upd(ll n, ll s, ll e, ll l, ll r, ll v){
		prop(n, s, e);
		if(e < l || s > r) return;
		if(l <= s && e <= r){
			Lz[n] = v; prop(n, s, e); return;
		}
		ll m = (s + e) / 2;
		upd(n * 2, s, m, l, r, v); upd(n * 2 + 1, m + 1, e, l, r, v);
		T[n] = min(T[n * 2], T[n * 2 + 1]);
		Rval[n] = Rval[n * 2 + 1];
	}
	ll Go(ll n, ll s, ll e, ll l, ll r, ll v){
		prop(n, s, e);
		if(s == e){
			return (T[n] >= v && l <= s && s <= r ? s - 1 : -1);
		}
		ll m = (s + e) / 2;
		if(r <= m) return Go(n * 2, s, m, l, r, v);
		if(l > m) return Go(n * 2 + 1, m + 1, e, l, r, v);
		prop(n * 2, s, m);
		if(Rval[n * 2] >= v){
			ll f = Go(n * 2 + 1, m + 1, e, l, r, v);
			return (f == -1 ? m - 1: f);
		}
		return Go(n * 2, s, m, l, r, v);
	}
	ll qry(ll n, ll s, ll e, ll l, ll r){
		prop(n, s, e);
		if(e < l || s > r) return INF;
		if(l <= s && e <= r) return T[n];
		ll m = (s + e) / 2;
		return min(qry(n * 2, s, m, l, r), qry(n * 2 + 1, m + 1, e, l, r));
	}
}seg;

void Chmin(ll l, ll r, ll v){
	v = min(v, INF);
	vector<ll> V;
	Mx.insert(l);
	auto it = Mx.lower_bound(l);
	while(it != Mx.end()){
		if(*it > r) break;
		V.push_back(*it);
		it = Mx.erase(it);
	}
	ll mn = min(v, seg.qry(l, l));
	for(ll i = 0; i < V.size(); i++){
		ll t = r;
		if(i + 1 < V.size()) t = min(t, V[i + 1] - 1);
		if(mn < INF){
			ll e = seg.Go(V[i], t, mn);
			if(e != -1){
				seg.upd(V[i], e, mn);
			}
		}
		mn = min(mn, seg.qry(V[i], t));
	}
	Mx.insert(l);
	if(r != D - 1) Mx.insert(r + 1);
}

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

    fill(seg.Lz, seg.Lz + 4500005, FUCK);
    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();
	Mx.insert(0);
	if(D != 1) Mx.insert(1);
	seg.upd(1, D - 1, INF);
    seg.upd(0, 0, 0);
    for(auto e : Ev){
        if(e.t == 0){
            seg.upd(e.lx, e.rx, INF);
			auto it = Mx.lower_bound(e.lx);
			while(it != Mx.end()){
				if(*it > e.rx) break;
				it = Mx.erase(it);
			}
			Mx.insert(e.lx);
			if(e.rx != D - 1) Mx.insert(e.rx + 1);
        } else if(e.t == 1){
            if(e.lx == 0 && e.rx == S - 1){
				ll c = seg.qry(S - 1, S - 1) + (A * D - B) * (e.ri - e.li + 1);
				if(e.li + 1 <= e.ri) c = min(c, seg.qry(0, S - 1) + min(A * D - B, (A * D - B) * (e.ri - e.li)));
				Chmin(0, S - 1, c);
            } else {
                if(e.lx == 0) Chmin(e.lx, e.rx, seg.qry(S - 1, S - 1) + A * D - B);
				Chmin(e.lx, e.rx, INF);	
            }
        } else {
            ll q = seg.qry(e.lx, e.lx) + A * Coord[e.lx] + B * e.li;
            Ans[-e.t] = (q > MAX_ANS ? -1 : q);
        }
    }
    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...