제출 #1150782

#제출 시각아이디문제언어결과실행 시간메모리
1150782Zero_OPEscape Route 2 (JOI24_escape2)C++20
100 / 100
2099 ms33044 KiB
#include <bits/stdc++.h> using namespace std; //loops (warning : long long) #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r - 1); i >= l; --i) //pairs, tuples #define mp make_pair #define mt make_tuple #define ff first #define ss second //vectors #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define pb push_back #define eb emplace_back #define sum_of(v) accumulate(all(v), 0ll) #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) //binary search #define lwb lower_bound #define upb upper_bound //other stuffs #define dbg(x) "[" #x " = " << (x) << "]" #define file(task) if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using ull = unsigned long long; using ld = long double; using db = double; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vb = vector<bool>; using vl = vector<ll>; using vpi = vector<pi>; using vpl = vector<pl>; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MAX = 1e5 + 5; const ll inf = 1e18; int B = 350; int N, T, L[MAX], R[MAX]; pi f[MAX], mark_flights[MAX]; vpi flights[MAX]; int lift[18][MAX]; ll cost[18][MAX]; bool cmp(pi& a, pi& b){ return mp(a.ff, -a.ss) < mp(b.ff, -b.ss); } void process(vpi& f){ //we never use flight (A[j], B[j]) if there is a (A[i], B[i]) that : ....A[j]....A[i]....B[i]...B[j] <=> A[j] <= A[i] && B[i] >= B[j] sort(all(f), cmp); compact(f); vpi result_f; FOR(i, 0, sz(f)){ while(!result_f.empty() && result_f.back().ss >= f[i].ss) result_f.pop_back(); result_f.pb(f[i]); } f = result_f; } ll jump_cost(int s, int step){ ll sum = 0; while(step > 0){ int b = 31 - __builtin_clz(step); sum += cost[b][s]; s = lift[b][s]; step -= (1 << b); } return sum + mark_flights[s].ss - mark_flights[s].ff; } void testcase(int ntestcase){ cin >> N >> T; int cnt = 0; FOR(i, 0, N-1){ int M; cin >> M; flights[i].resize(M); FOR(j, 0, M) { cin >> flights[i][j].ff >> flights[i][j].ss; } process(flights[i]); L[i] = cnt; R[i] = L[i] + sz(flights[i]); cnt = R[i]; FOR(j, 0, sz(flights[i])){ mark_flights[L[i] + j] = flights[i][j]; } } L[N-1] = cnt; R[N-1] = cnt+1; FOR(i, 0, sz(flights[N-2])){ lift[0][L[N-2] + i] = cnt; cost[0][L[N-2] + i] = flights[N-2][i].ss - flights[N-2][i].ff; } FOR(i, 0, N-2){ int ptr = 0; FOR(j, 0, sz(flights[i])){ while(ptr < sz(flights[i+1]) && flights[i+1][ptr].ff < flights[i][j].ss) ++ptr; if(ptr == sz(flights[i+1])){ lift[0][L[i] + j] = L[i+1]; cost[0][L[i] + j] = T - flights[i][j].ff + flights[i+1][0].ff; } else{ lift[0][L[i] + j] = L[i+1] + ptr; cost[0][L[i] + j] = flights[i+1][ptr].ff - flights[i][j].ff; } } } for(int i = 1; i <= 16; ++i){ FOR(j, 0, cnt){ lift[i][j] = lift[i-1][lift[i-1][j]]; cost[i][j] = cost[i-1][j] + cost[i-1][lift[i-1][j]]; } } vector<vl> precalc; vi idx(N-1, -1); int num_heavy = 0; vl dp(cnt+1); FOR(i, 0, N-1){ if(sz(flights[i]) > B){ idx[i] = num_heavy++; precalc.pb(vl(N-i, inf)); precalc.back()[0] = 0; fill(all(dp), inf); FOR(j, L[i], R[i]) dp[j] = 0; FOR(j, i, N-1){ FOR(k, L[j], R[j]){ minimize(precalc.back()[j-i+1], dp[k] + mark_flights[k].ss - mark_flights[k].ff); if(i == N-1) continue; int nxt = lift[0][k]; minimize(dp[nxt], dp[k] + cost[0][k]); } } } } int Q; cin >> Q; while(Q--){ int l, r; cin >> l >> r; --l, --r; if(idx[l] != -1){ cout << precalc[idx[l]][r-l] << '\n'; } else{ ll result = inf; FOR(i, L[l], R[l]){ minimize(result, jump_cost(i, r - l - 1)); } cout << result << '\n'; } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("task.out", "w", stdout); #endif // LOCAL int T = 1; // cin >> T; FOR(i, 0, T) testcase(i); return 0; }
#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...