Submission #1155199

#TimeUsernameProblemLanguageResultExecution timeMemory
1155199Math4Life2020Escape Route 2 (JOI24_escape2)C++20
14 / 100
3098 ms102348 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long; using pii = pair<ll,ll>;

const ll Nm = 131072; const ll E = 17; const ll INF = 1e18;

ll len[Nm]; //time (length) from index
pii intv[Nm];
pii bjumpR[Nm][E]; //reverse bjump
//{new jump index, time (end to end)}
pii bjumpF[Nm][E]; //forward bjump
ll IND = 0;

inline pii fz(pii p1, pii p2) {
    if (p1.first<p2.first) {
        return p1;
    }
    return p2;
}

inline ll v2(ll x) {
    return __builtin_ctz(x);
}

inline ll l2(ll x) {
    return (31-__builtin_clz(x));
}

pii stm[2*Nm];

pii gmin(ll a, ll b) {
    if (a>b) {
        return {INF,INF};
    }
    ll va = v2(a); ll vb = v2(b+1);
    if (va<vb) {
        return fz(stm[(a>>va)+(1<<(E-va))],gmin(a+(1<<va),b));
    } else {
        return fz(stm[(b>>vb)+(1<<(E-vb))],gmin(a,b-(1<<vb)));
    }
}

ll grd(ll i0, ll d) {
    assert(d>=0);
    if (d==0) {
        return 0;
    }
    //ll ld = l2(d);
    ll ld = 0;
    return (grd(bjumpR[i0][ld].first,d-(1<<ld))+bjumpR[i0][ld].second);
}

ll gfd(ll i0, ll d) {
    assert(d>=0);
    if (d==0) {
        return 0;
    }
    //ll ld = l2(d);
    ll ld = 0;
    return (gfd(bjumpF[i0][ld].first,d-(1<<ld))+bjumpF[i0][ld].second);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
    ll N,T; cin >> N >> T;
    vector<pii> rng[N];
    vector<ll> idx[N];
    map<ll,ll> sind[N]; //start time -> index
    map<ll,ll> eind[N]; //end time -> index 
    for (ll i=0;i<(N-1);i++) {
        ll M; cin >> M;
        multiset<ll> sl; //set of lefts
        vector<pii> vba;
        vector<pii> vnew;
        for (ll tc=0;tc<M;tc++) {
            ll a,b; cin >> a >> b;
            vba.push_back({b,a});
            sl.insert(a);
        }
        sort(vba.rbegin(),vba.rend());
        for (pii p0: vba) {
            ll xl = *(--sl.end());
            vnew.push_back({xl,p0.first});
            sl.erase(sl.find(p0.second));
        }
        sort(vnew.begin(),vnew.end());
        ll xlc = -1;
        for (pii p0: vnew) {
            if (p0.first!=xlc) {
                rng[i].push_back(p0);
            }
            xlc = p0.first;
        }
        stm[i+Nm]={rng[i].size(),i};
        assert(rng[i].size()>=1);
        for (pii p0: rng[i]) {
            //cout << "i="<<i<<"; rng elem="<<p0.first<<","<<p0.second<<"\n";
            //cout << "IND="<<IND<<"\n";
            sind[i][p0.first]=IND;
            eind[i][p0.second]=IND;
            idx[i].push_back(IND);
            intv[IND]={p0.first,p0.second};
            len[IND] = p0.second-p0.first;
            IND++;
        }
        assert(idx[i].size()==rng[i].size());
    }
    for (ll p=(Nm-1);p>=1;p--) {
        stm[p]=fz(stm[2*p],stm[2*p+1]);
    }
    for (ll i=0;i<N;i++) {
        for (ll x=0;x<rng[i].size();x++) {
            ll cind = idx[i][x];
            pii p0 = rng[i][x];
            //cout << "i,x,cind="<<i<<","<<x<<","<<cind<<"\n";
            if (i<(N-2)) {
                auto A0 = sind[i+1].lower_bound(p0.second);
                if (A0==sind[i+1].end()) {
                    A0 = sind[i+1].begin();
                    ll nind = (*A0).second;
                    bjumpF[cind][0]={nind,intv[nind].second-intv[cind].second+T};
                } else {
                    ll nind = (*A0).second;
                    bjumpF[cind][0]={nind,intv[nind].second-intv[cind].second};
                }
            } else {
                bjumpF[cind][0]={0,0};
            }
            if (i>0) {
                //cout << "i="<<i<<", p0="<<p0.first<<", "<<p0.second<<"\n";
                auto A0 = eind[i-1].upper_bound(p0.first);
                if (A0==eind[i-1].begin()) {
                    A0 = eind[i-1].end();
                    A0--;
                    ll nind = (*A0).second;
                    //cout << "f2nind = "<<nind<<"\n";
                    bjumpR[cind][0]={nind,-intv[nind].first+intv[cind].first+T};
                    //cout << "r value: "<<bjumpR[cind][0].second<<"\n";
                } else {
                    A0--;
                    ll nind = (*A0).second;
                    //cout << "f1nind = "<<nind<<"\n";
                    bjumpR[cind][0]={nind,-intv[nind].first+intv[cind].first};
                    //cout << "r value: "<<bjumpR[cind][0].second<<"\n";
                }
            } else {
                bjumpR[cind][0]={0,0};
            }
        }
    }
    for (ll i=0;i<Nm;i++) {
        for (ll e=1;e<E;e++) {
            pii pxf = bjumpF[i][e-1];
            bjumpF[i][e]={bjumpF[pxf.first][e-1].first,bjumpF[pxf.first][e-1].second+pxf.second};
            pii pxr = bjumpR[i][e-1];
            bjumpR[i][e]={bjumpR[pxr.first][e-1].first,bjumpR[pxr.first][e-1].second+pxr.second};
        }
    }
    ll Q; cin >> Q;
    map<pii,ll> AMEM;
    for (ll q=0;q<Q;q++) {
        ll l,r; cin >> l >> r;
        l--; r--;
        if (AMEM.find({l,r})!=AMEM.end()) {
            cout << AMEM[{l,r}] << "\n";
            continue;
        }
        ll ans = INF;
        ll xmax = gmin(l,r-1).second;
        //cout << "xmax="<<xmax<<"\n";
        for (ll idx0: idx[xmax]) {
            //cout << "idx0="<<idx0<<"\n";
            //cout << "terms: "<<grd(idx0,xmax-l)<<","<<gfd(idx0,r-1-xmax)<<","<<len[idx0]<<"\n";
            ans = min(ans,grd(idx0,xmax-l)+gfd(idx0,r-1-xmax)+len[idx0]);
        }
        AMEM[{l,r}]=ans;
        cout << ans << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...