Submission #526421

#TimeUsernameProblemLanguageResultExecution timeMemory
526421benson1029Railway Trip 2 (JOI22_ho_t4)C++14
100 / 100
1076 ms347268 KiB
#include<bits/stdc++.h> using namespace std; int n,k,m; int a[200005], b[200005]; int logb2[200005]; int l[200005][20], r[200005][20]; int liftl[200005][20], liftr[200005][20]; int sliftl[20][200005][20], sliftr[20][200005][20]; int q, s, t; int qryl(int x, int y) { if(x<1) x = 1; if(y>n) y = n; int logv = logb2[y-x+1]; return min(l[x][logv], l[y-(1<<logv)+1][logv]); } int qryr(int x, int y) { if(x<1) x = 1; if(y>n) y = n; int logv = logb2[y-x+1]; return max(r[x][logv], r[y-(1<<logv)+1][logv]); } int sqryl(int id, int x, int y) { if(x<1) x = 1; if(y>n) y = n; int logv = logb2[y-x+1]; return min(sliftl[id][x][logv], sliftl[id][y-(1<<logv)+1][logv]); } int sqryr(int id, int x, int y) { if(x<1) x = 1; if(y>n) y = n; int logv = logb2[y-x+1]; return max(sliftr[id][x][logv], sliftr[id][y-(1<<logv)+1][logv]); } int main() { cin >> n >> k >> m; for(int i=0; (1<<i)<=n; i++) { logb2[(1<<i)] = i; } for(int i=2; i<=n; i++) { if(logb2[i]==0) logb2[i] = logb2[i-1]; } for(int i=1; i<=n; i++) { l[i][0] = i; r[i][0] = i; } for(int i=0; i<m; i++) { cin >> a[i] >> b[i]; if(a[i] > b[i]) { l[a[i]][0] = min(l[a[i]][0], b[i]); } else { r[a[i]][0] = max(r[a[i]][0], b[i]); } } for(int j=1; j<20; j++) { for(int i=1; i<=n; i++) { if(i+(1<<(j-1)) <= n) { l[i][j] = min(l[i][j-1], l[i+(1<<(j-1))][j-1]); r[i][j] = max(r[i][j-1], r[i+(1<<(j-1))][j-1]); } } } for(int j=0; j<20; j++) { if(j==0) { for(int i=1; i<=n; i++) { liftl[i][0] = qryl(i, i+k-1); liftr[i][0] = qryr(i-k+1, i); } } else { for(int i=1; i<=n; i++) { liftl[i][j] = sqryl(j-1, liftl[i][j-1], liftr[i][j-1]); //liftl[liftl[i][j-1]][j-1]; liftr[i][j] = sqryr(j-1, liftl[i][j-1], liftr[i][j-1]); } } for(int i=1; i<=n; i++) { sliftl[j][i][0] = liftl[i][j]; sliftr[j][i][0] = liftr[i][j]; } for(int k=1; k<20; k++) { for(int i=1; i<=n; i++) { if(i+(1<<(k-1)) <= n) { sliftl[j][i][k] = min(sliftl[j][i][k-1], sliftl[j][i+(1<<(k-1))][k-1]); sliftr[j][i][k] = max(sliftr[j][i][k-1], sliftr[j][i+(1<<(k-1))][k-1]); } } } } cin >> q; while(q--) { cin >> s >> t; int ans = 0, orig = s; int l = s, r = s, ll, rr; for(int i=19; i>=0; i--) { ll = sqryl(i, l, r); rr = sqryr(i, l, r); if(!(ll <= t && t <= rr)) { l = ll; r = rr; ans += (1<<i); } } ll = sqryl(0, l, r); rr = sqryr(0, l, r); if(ll<=t && t<=rr) cout << ans+1 << "\n"; else cout << "-1\n"; } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:96:16: warning: unused variable 'orig' [-Wunused-variable]
   96 |   int ans = 0, orig = s;
      |                ^~~~
#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...