제출 #1223815

#제출 시각아이디문제언어결과실행 시간메모리
1223815HanksburgerRailway Trip 2 (JOI22_ho_t4)C++20
87 / 100
2063 ms70376 KiB
#include <bits/stdc++.h> using namespace std; int segMn[400005][17], segMx[400005][17], lazyMn[400005][17], lazyMx[400005][17]; void pushMn(int i, int j) { if (lazyMn[i][j]<1e9) { segMn[i*2][j]=min(segMn[i*2][j], lazyMn[i][j]); lazyMn[i*2][j]=min(lazyMn[i*2][j], lazyMn[i][j]); segMn[i*2+1][j]=min(segMn[i*2+1][j], lazyMn[i][j]); lazyMn[i*2+1][j]=min(lazyMn[i*2+1][j], lazyMn[i][j]); lazyMn[i][j]=1e9; } } void pushMx(int i, int j) { if (lazyMx[i][j]) { segMx[i*2][j]=max(segMx[i*2][j], lazyMx[i][j]); lazyMx[i*2][j]=max(lazyMx[i*2][j], lazyMx[i][j]); segMx[i*2+1][j]=max(segMx[i*2+1][j], lazyMx[i][j]); lazyMx[i*2+1][j]=max(lazyMx[i*2+1][j], lazyMx[i][j]); lazyMx[i][j]=0; } } void build(int i, int j, int l, int r) { if (l==r) { segMn[i][j]=segMx[i][j]=l; lazyMn[i][j]=1e9; return; } int mid=(l+r)/2; build(i*2, j, l, mid); build(i*2+1, j, mid+1, r); segMn[i][j]=min(segMn[i*2][j], segMn[i*2+1][j]); segMx[i][j]=max(segMx[i*2][j], segMx[i*2+1][j]); lazyMn[i][j]=1e9; } void updateMn(int i, int j, int l, int r, int ql, int qr, int x) { if (ql<=l && r<=qr) { segMn[i][j]=min(segMn[i][j], x); lazyMn[i][j]=min(lazyMn[i][j], x); return; } pushMn(i, j); int mid=(l+r)/2; if (l<=qr && ql<=mid) updateMn(i*2, j, l, mid, ql, qr, x); if (mid<qr && ql<=r) updateMn(i*2+1, j, mid+1, r, ql, qr, x); segMn[i][j]=min(segMn[i*2][j], segMn[i*2+1][j]); } void updateMx(int i, int j, int l, int r, int ql, int qr, int x) { if (ql<=l && r<=qr) { segMx[i][j]=max(segMx[i][j], x); lazyMx[i][j]=max(lazyMx[i][j], x); return; } pushMx(i, j); int mid=(l+r)/2; if (l<=qr && ql<=mid) updateMx(i*2, j, l, mid, ql, qr, x); if (mid<qr && ql<=r) updateMx(i*2+1, j, mid+1, r, ql, qr, x); segMx[i][j]=max(segMx[i*2][j], segMx[i*2+1][j]); } int queryMn(int i, int j, int l, int r, int ql, int qr) { if (ql<=l && r<=qr) return segMn[i][j]; pushMn(i, j); int mid=(l+r)/2, res=1e9; if (l<=qr && ql<=mid) res=min(res, queryMn(i*2, j, l, mid, ql, qr)); if (mid<qr && ql<=r) res=min(res, queryMn(i*2+1, j, mid+1, r, ql, qr)); return res; } int queryMx(int i, int j, int l, int r, int ql, int qr) { if (ql<=l && r<=qr) return segMx[i][j]; pushMx(i, j); int mid=(l+r)/2, res=0; if (l<=qr && ql<=mid) res=max(res, queryMx(i*2, j, l, mid, ql, qr)); if (mid<qr && ql<=r) res=max(res, queryMx(i*2+1, j, mid+1, r, ql, qr)); return res; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, m, q; cin >> n >> k >> m; build(1, 0, 1, n); for (int i=1; i<=m; i++) { int a, b; cin >> a >> b; if (a<b) updateMx(1, 0, 1, n, a, min(a+k-1, b-1), b); else updateMn(1, 0, 1, n, max(b+1, a-k+1), a, b); } for (int i=1; i<17; i++) { build(1, i, 1, n); for (int j=1; j<=n; j++) { int L=queryMn(1, i-1, 1, n, j, j); int R=queryMx(1, i-1, 1, n, j, j); int LL=queryMn(1, i-1, 1, n, L, R); int RR=queryMx(1, i-1, 1, n, L, R); updateMn(1, i, 1, n, j, j, LL); updateMx(1, i, 1, n, j, j, RR); } } cin >> q; for (int i=1; i<=q; i++) { int a, b; cin >> a >> b; int curL=a, curR=a, ans=1; for (int j=16; j>=0; j--) { int L=queryMn(1, j, 1, n, curL, curR); int R=queryMx(1, j, 1, n, curL, curR); if (b<L || R<b) { curL=L; curR=R; ans+=1<<j; } } cout << (ans>n?-1: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...