제출 #527693

#제출 시각아이디문제언어결과실행 시간메모리
527693CSQ31Railway Trip 2 (JOI22_ho_t4)C++17
100 / 100
705 ms103008 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define owo ios_base::sync_with_stdio(0);cin.tie(0); const int MAXN = 1e5+2; int l[18][MAXN],r[18][MAXN]; vector<int>e[MAXN],f[MAXN]; struct seg{ int n; vector<int>mn,mx; vector<pair<int,int>>a; seg(){} seg(int _n,vector<pair<int,int>>_a){ n = _n; a = _a; mn.assign(4*n+1,1e9); mx.assign(4*n+1,0); } void build(int v,int l,int r){ if(l==r){ mn[v] = a[l].first; mx[v] = a[l].second; } else{ int tm = (l+r)/2; build(2*v,l,tm); build(2*v+1,tm+1,r); mn[v] = min(mn[2*v],mn[2*v+1]); mx[v] = max(mx[2*v],mx[2*v+1]); } } pair<int,int>query(int v,int l,int r,int tl,int tr){ if(l > r)return {1e9,-1e9}; if(l==tl && r==tr)return {mn[v],mx[v]}; int tm = (tl+tr)/2; pair<int,int>a = query(2*v,l,min(r,tm),tl,tm); pair<int,int>b = query(2*v+1,max(l,tm+1),r,tm+1,tr); a.first = min(a.first,b.first); a.second = max(a.second,b.second); return a; } }; int main() { owo int n,k,m,q; cin>>n>>k>>m; for(int i=0;i<m;i++){ int s,t; cin>>s>>t; if(s < t){ e[s].pb(t); e[min(s+k,t+1)].pb(-t); }else{ f[s].pb(t); f[max(s-k,t-1)].pb(-t); } } multiset<int,greater<int>>ss; for(int i=1;i<=n;i++){ for(int x:e[i]){ if(x>0)ss.insert(x); else ss.erase(ss.find(-x)); } if(ss.empty())r[0][i] = i; else r[0][i] = *ss.begin(); } ss.clear(); for(int i=n;i>=1;i--){ for(int x:f[i]){ if(x>0)ss.insert(-x); else ss.erase(ss.find(x)); } if(ss.empty())l[0][i] = i; else l[0][i] = -(*ss.begin()); } vector<seg>p(18); for(int i=0;i<=17;i++){ if(i){ for(int j=1;j<=n;j++){ pair<int,int>res = p[i-1].query(1,l[i-1][j],r[i-1][j],1,n); l[i][j] = res.first; r[i][j] = res.second; } } vector<pair<int,int>>a(n+1); for(int j=1;j<=n;j++){ a[j].first = l[i][j]; a[j].second = r[i][j]; } p[i] = seg(n,a); p[i].build(1,1,n); } cin>>q; while(q--){ int s,t; cin>>s>>t; if(t < l[17][s] || t > r[17][s]){ cout<<-1<<'\n'; continue; } int ans = 0; int L = s,R = s; for(int i=17;i>=0;i--){ pair<int,int>res = p[i].query(1,L,R,1,n); if(res.first > t || res.second < t){ ans+=(1<<i); L = res.first; R = res.second; } } cout<<ans+1<<'\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...