제출 #1240176

#제출 시각아이디문제언어결과실행 시간메모리
1240176GrayEscape Route 2 (JOI24_escape2)C++20
100 / 100
2075 ms79820 KiB
#include<bits/stdc++.h>

#define ll long long
#define ff first
#define ss second
#define ln "\n"

using namespace std;
const ll INF = 2e18;


void solve(){
    ll n, t; cin >> n >> t;
    vector<vector<array<ll, 2>>> flight(n-1);
    for (ll i=0; i<n-1; i++){
        ll m; cin >> m;
        flight[i].resize(m);
        for (ll j=0; j<m; j++){
            cin >> flight[i][j][0] >> flight[i][j][1];
        }
        sort(flight[i].begin(), flight[i].end());
    }
    // vector<vector<array<ll, 3>>> binjf(n-1, vector<array<ll, 3>>(17, {-1, -1, INF}));
    vector<vector<array<ll, 2>>> pref(n-1), suff(n-1);
    vector<vector<vector<array<ll, 3>>>> binj(n-1);

    for (ll i=n-2; i>=0; i--){
        ll m = flight[i].size();
        pref[i].resize(m); suff[i].resize(m); 
        binj[i].resize(m, vector<array<ll, 3>>(17));
        for (ll j=m-1; j>=0; j--){
            suff[i][j]=min((j+1<m?suff[i][j+1]:array<ll, 2>{INF, -1}), {flight[i][j][1], j});
        }
        for (ll j=0; j<m; j++){
            pref[i][j]=min((j?pref[i][j-1]:array<ll, 2>{INF, -1}), {flight[i][j][1], j});
        }
        if (i==n-2){
            for (ll j=0; j<m; j++){
                for (ll pw=0; pw<17; pw++) {
                    binj[i][j][pw]={i, j, 0};
                    // if (binjf[i][pw][2]>binj[i][j][pw]) binjf[i][pw]=binj[i][j][pw];
                }
            }
        }else{
            for (ll j=0; j<m; j++){
                ll ind = lower_bound(flight[i+1].begin(), flight[i+1].end(), array<ll, 2>{flight[i][j][1], 0})-flight[i+1].begin();
                if (ind==(ll)flight[i+1].size()){
                    ll dep = pref[i+1].back()[1];
                    binj[i][j][0] = {i+1, dep, flight[i][j][1]-flight[i][j][0]+t-flight[i][j][1]+flight[i+1][dep][0]};
                }else{
                    ll dep = suff[i+1][ind][1];
                    binj[i][j][0] = {i+1, dep, flight[i][j][1]-flight[i][j][0]+flight[i+1][dep][0]-flight[i][j][1]};
                }
                for (ll pw=1; pw<17; pw++){
                    ll parj = binj[i][j][pw-1][1], pari=binj[i][j][pw-1][0], cost=binj[i][j][pw-1][2];
                    ll pparj = binj[pari][parj][pw-1][1], ppari=binj[pari][parj][pw-1][0], ppcost=binj[pari][parj][pw-1][2];
                    binj[i][j][pw]={ppari, pparj, cost+ppcost};
                }
            }
        }
    }
    ll q; cin >> q;

    vector<vector<array<ll, 2>>> qry(n);
    for (ll i=0; i<q; i++){
        ll l, r; cin >> l >> r; l--; r--; qry[l].push_back({r, i});
    }
    vector<ll> res(q);
    ll cmp=0;
    for (ll i=0; i<n; i++){
        if (qry[i].empty()) continue;
        sort(qry[i].begin(), qry[i].end());
        vector<array<ll, 3>> pos; ll m = flight[i].size();
        for (ll j=0; j<m; j++) pos.push_back({i, j, 0});
        ll lpos=i;
        // cout << i << ": ";
        for (ll j=0; j<(ll)qry[i].size(); j++){
            if (j and qry[i][j][0]==qry[i][j-1][0]){
                res[qry[i][j][1]]=res[qry[i][j-1][1]]; continue;
            }
            ll cur = qry[i][j][0];
            ll jmp = cur-lpos-1, best=INF;
            for (auto &[ci, cj, cc]:pos){
                for (ll pw=16; pw>=0; pw--){
                    if (jmp&(1<<pw)){
                        cc+=binj[ci][cj][pw][2];
                        ll nci = binj[ci][cj][pw][0];
                        ll ncj = binj[ci][cj][pw][1];
                        ci=nci; cj=ncj; cmp++;
                    }
                }
                best=min(best, cc+flight[ci][cj][1]-flight[ci][cj][0]);
            }
            // cout << cur << "&" << jmp << "=" << best << "   ";
            res[qry[i][j][1]]=best; lpos=cur-1; 
            sort(pos.begin(), pos.end());
            pos.erase(unique(pos.begin(), pos.end(), [&](auto &op1, auto &op2){
                if (op1[0]==op2[0] and op1[1]==op2[1]) return 1;
                return 0;
            }), pos.end());
        }
        // cout << ln;
    }
    for (ll i=0; i<q; i++) cout << res[i] << ln;
    // assert(cmp<1e9);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t=1; 
    // cin >> t;
    while (t--){
        solve();
    }
}
#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...