Submission #1240176

#TimeUsernameProblemLanguageResultExecution timeMemory
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...