Submission #1030902

#TimeUsernameProblemLanguageResultExecution timeMemory
1030902AntekbTower (JOI24_tower)C++17
100 / 100
193 ms21444 KiB
#include "bits/stdc++.h"	/** keep-include */
using namespace std;

#define rep(i, b, e) for(int i = (b); i <= (e); i++)
#define per(i, b, e) for(int i = (e); i >= (b); i--)
#define FOR(i, b, e) rep(i, b, (e) - 1)
#define SZ(x) int(x.size())
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define st first
#define nd second
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;

auto &operator<<(auto &o, pair<auto, auto> p) {
	return o << "(" << p.st << ", " << p.nd << ")"; }
auto operator<<(auto &o, auto x)->decltype(end(x), o) {
	o << "{"; int i=0; for(auto e: x) o << ", " + 2*!i++ << e;
	return o << "}"; }
#ifdef LOCAL
#define deb(x...) cerr << "[" #x "]: ", [](auto...$) { \
	((cerr << $ << "; "),...) << endl; }(x)
#else
#define deb(...)
#endif

using se=pair<pair<ll, ll>, ll>;
bool from_both_sides;

void insert(set<se> &S, ll l, ll r, ll c){
    vector<se> todo;
    auto it=S.lower_bound(se(mp(mp(l, 0), 0)));
    if(it!=S.begin())it--;
    while(it!=S.end() && it->st.st<=r){
        todo.pb(*it);
        it++;
    }
    for(auto i : todo){
        ll L=i.st.st, R=i.st.nd, C=i.nd;
        if(L>r || R<l)continue;
        S.erase(i);
        if(L<l){
            S.insert(mp(mp(L, l-1), C));
        }
        if(R>r){
            S.insert(mp(mp(r+1, R), C+max(0ll, r+1-L)));
        }
    }
    S.insert(se(mp(l, r),  c));
}
ll pytaj(set<se> &S, ll x, ll D){
    auto it=S.lower_bound(mp(mp(x%D+1,0), 0));
    deb(x, D);
    if(it==S.begin())return x%D;
    it--;
    deb(x, D, *it);
    if(x%D<=it->st.nd){
        deb("a");
        if(it->st.st==0 && from_both_sides){
            it=S.end();
            it--;
            return x%D+D-it->st.st+1+it->nd;
        }
        return x%D-it->st.st+1+it->nd;
    }
    else return x%D;
}
void solve() {
	int n, q;
    cin>>n>>q;
    ll A, B, D;
    cin>>D>>A>>B;
    vector<pair<ll ,ll>> seg;
    for(int i=0; i<n; i++){
        ll l, r;
        cin>>l>>r;
        r=max(r, D-1);
        if(i==0){
            seg.pb(mp(l, r));
        }
        else {
            if(l<=seg.back().nd+1){
                seg.back().nd=max(seg.back().nd, r);
            }
            else seg.pb(mp(l, r));
            int t=lower_bound(all(seg), mp(r+2-D,0ll))-seg.begin();
            t--;
            if(t>=0){
                seg.back().nd=max(seg.back().nd, seg[t].nd+D);
            }
        }
        if(seg.back().nd-seg.back().st>=D-1)seg.back().nd=1e12;
        deb(seg);
    }
    B-=A*D;
    n=seg.size();
    vector<pair<ll, int> > Q;
    vector<ll> res(q);
    for(int i=0; i<q; i++){
        ll x;
        cin>>x;
        int t=lower_bound(all(seg), mp(x+1, 0ll))-seg.begin();
        t--;
        if(t>=0 && seg[t].nd>=x){
            res[i]=-1;
            continue;
        }
        Q.pb(mp(x, i));
        res[i]=x*A;
    }
    if(B>0){
        vector<ll> odp(n);
        for(int i=0; i<n; i++){
            int t=lower_bound(all(seg), mp(seg[i].nd+2-D,0ll))-seg.begin();
            if(t==0)odp[i]=1;
            else{
                odp[i]=odp[t-1]+1;
            }
        }
        for(auto &[x, id] : Q){
            int t=lower_bound(all(seg), mp(x+1, 0ll))-seg.begin();
            t--;
            if(t>=0)res[id]+=B*odp[t];
        }
    }
    else{
        deb(A, B, D, Q);
        set<se> S;
        sort(all(Q));
        reverse(all(Q));
        seg.pb(mp(2e12, 2e12));
        for(auto &[l, r] : seg){
            while(Q.size() && Q.back().st<l){
                ll x=Q.back().st;
                int id=Q.back().nd;
                Q.pop_back();
                res[id]+=B*((x-pytaj(S, x, D))/D);
            }
            if(l>1e12){
                break;
            }
            ll val=pytaj(S, l-1, D);
            deb(l, r, val);
            if(l/D==r/D){
                insert(S, l%D, r%D, val);
                if(l%D==0 || r%D==D-1)from_both_sides=0;
            }
            else{
                insert(S, l%D, D-1, val);
                insert(S, 0, r%D, val+D-(l%D));
                from_both_sides=1;
            }
            deb("S");
            for(auto &i:S){
                deb(i);
            }
        }
    }
    for(int i=0; i<q; i++){
        cout<<res[i]<<"\n";
    }
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int tt = 1;
	// cin >> tt;
	FOR(te, 0, tt) solve();
	return 0;
}

Compilation message (stderr)

Main.cpp:17:18: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   17 | auto &operator<<(auto &o, pair<auto, auto> p) {
      |                  ^~~~
Main.cpp:17:32: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   17 | auto &operator<<(auto &o, pair<auto, auto> p) {
      |                                ^~~~
Main.cpp:17:38: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   17 | auto &operator<<(auto &o, pair<auto, auto> p) {
      |                                      ^~~~
Main.cpp:19:17: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   19 | auto operator<<(auto &o, auto x)->decltype(end(x), o) {
      |                 ^~~~
Main.cpp:19:26: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   19 | auto operator<<(auto &o, auto x)->decltype(end(x), o) {
      |                          ^~~~
Main.cpp: In function 'void solve()':
Main.cpp:156:23: warning: unused variable 'i' [-Wunused-variable]
  156 |             for(auto &i:S){
      |                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...