Submission #544814

#TimeUsernameProblemLanguageResultExecution timeMemory
544814blueRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
654 ms79168 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; using vi = vector<int>; using vvi = vector<vi>; const int lg = 17; const int Z = (1<<lg); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, K; cin >> N >> K; int M; cin >> M; vi re(Z<<1, 1), le(Z<<1, N); for(int i = 1; i <= N; i++) re[i+Z] = le[i+Z] = i; // cerr << "A\n"; for(int i = 1; i <= M; i++) { int A, B; cin >> A >> B; if(A < B) { int L = A + Z, R = min(A+K-1,B) + Z + 1; // cerr << '\n'; // cerr << L-Z << ' ' << R-Z-1 << " -> " << B << '\n'; while(L < R) { if(L & 1) { re[L] = max(re[L], B); L++; } if(R & 1) { R--; re[R] = max(re[R], B); } L >>= 1; R >>= 1; } } else { int L = max(A-K+1, B) + Z, R = A + Z + 1; // cerr << L-Z << ' ' << R-Z-1 << " <- " << B << '\n'; while(L < R) { if(L & 1) { le[L] = min(le[L], B); L++; } if(R & 1) { R--; le[R] = min(le[R], B); } L >>= 1; R >>= 1; } } } // cerr << "B\n"; vvi jmpL(1+N, vi(1+lg, N)), jmpR(1+N, vi(1+lg, 1)); vvi Ltree(Z<<1, vi(1+lg, N)), Rtree(Z<<1, vi(1+lg, 1)); for(int i = 1; i <= N; i++) { for(int j = i+Z; j >= 1; j >>= 1) { jmpL[i][0] = min(jmpL[i][0], le[j]); jmpR[i][0] = max(jmpR[i][0], re[j]); } Ltree[Z+i][0] = jmpL[i][0]; Rtree[Z+i][0] = jmpR[i][0]; } for(int z = Z-1; z >= 1; z--) { Ltree[z][0] = min(Ltree[2*z][0], Ltree[2*z+1][0]); Rtree[z][0] = max(Rtree[2*z][0], Rtree[2*z+1][0]); } // cerr << "C\n"; // for(int i = 1; i <= N; i++) cerr << i << ' ' << 0 << " : " << jmpL[i][0] << ' ' << jmpR[i][0] << '\n'; for(int e = 1; e <= lg; e++) { for(int i = 1; i <= N; i++) { int L = jmpL[i][e-1] + Z; int R = jmpR[i][e-1] + Z + 1; // for(int h = jmpL[i][e-1]; h <= jmpR[i][e-1]; h++) // { // jmpL[i][e] = min(jmpL[i][e], jmpL[h][e-1]); // jmpR[i][e] = max(jmpR[i][e], jmpR[h][e-1]); // } // cerr << i << ' ' << e << " : " << jmpL[i][e] << ' ' << jmpR[i][e] << '\n'; while(L < R) { // cerr << L << ' ' << R << "\n"; if(L & 1) { jmpL[i][e] = min(jmpL[i][e], Ltree[L][e-1]); jmpR[i][e] = max(jmpR[i][e], Rtree[L][e-1]); L++; } if(R & 1) { R--; jmpL[i][e] = min(jmpL[i][e], Ltree[R][e-1]); jmpR[i][e] = max(jmpR[i][e], Rtree[R][e-1]); } L >>= 1; R >>= 1; } Ltree[Z+i][e] = jmpL[i][e]; Rtree[Z+i][e] = jmpR[i][e]; } for(int z = Z-1; z >= 1; z--) { Ltree[z][e] = min(Ltree[2*z][e], Ltree[2*z+1][e]); Rtree[z][e] = max(Rtree[2*z][e], Rtree[2*z+1][e]); } } // cerr << "D\n"; // for(int i = 1; i <= N; i++) cerr << i << " : " << jmpL[i][0] << ' ' << jmpR[i][0] << " - " << jmpL[i][lg] << ' ' << jmpR[i][lg] << '\n'; int Q; cin >> Q; for(int q = 1; q <= Q; q++) { int S, T; cin >> S >> T; if(!(jmpL[S][lg] <= T && T <= jmpR[S][lg])) { cout << "-1\n"; continue; } int ans = 1; int SL = S, SR = S; for(int e = lg; e >= 0; e--) { int NL = SL, NR = SR; int L = SL + Z; int R = SR + Z + 1; while(L < R) { if(L & 1) { NL = min(NL, Ltree[L][e]); NR = max(NR, Rtree[L][e]); L++; } if(R & 1) { R--; NL = min(NL, Ltree[R][e]); NR = max(NR, Rtree[R][e]); } L >>= 1; R >>= 1; } // cerr << SL << ' ' << SR << "\n"; // cerr << "e = " << e << " : " << NL << ' ' << NR << '\n'; if(NL <= T && T <= NR) continue; // cerr << "executed\n"; ans += (1<<e); SL = NL, SR = NR; } 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...