Submission #1200012

#TimeUsernameProblemLanguageResultExecution timeMemory
1200012JuanJLRailway Trip 2 (JOI22_ho_t4)C++20
35 / 100
817 ms81884 KiB
#include <bits/stdc++.h> #define fst first #define snd second #define pb push_back #define forn(i,a,b) for(int i = a; i < b; i++) #define ALL(x) x.begin(),x.end() #define mset(a,v) memset(a,v,sizeof(a)) using namespace std; typedef long long ll; #define NEUT (ll)-1 struct STree{ ll n; vector<ll> st; STree(ll n=0):n(n),st(4*n+5,-1){} void upd(ll k,ll l,ll r, ll p, ll v){ if(l+1==r){ st[k]=v; return; } ll mid = (l+r)/2; if(mid>p) upd(2*k,l,mid,p,v); else upd(2*k+1,mid,r,p,v); st[k]=max(st[2*k],st[2*k+1]); } ll query(ll k,ll l,ll r,ll L,ll R){ if(l>=R||r<=L) return NEUT; if(l>=L&&r<=R) return st[k]; ll mid = (l+r)/2; return max(query(2*k,l,mid,L,R),query(2*k+1,mid,r,L,R)); } void upd(ll p,ll v){ upd(1,0,n,p,v); } ll query(ll l,ll r){ return query(1,0,n,l,r); } }; const int MAXN = 200000+5; const int MAXP = 20; ll n,k,m; ll aa[MAXN]; ll bb[MAXN]; ll blift[MAXN][MAXP]; STree st[MAXP]; void precalc(){ vector<pair<ll,ll>> orden={}; forn(i,0,m){ orden.pb({aa[i],bb[i]}); orden.pb({aa[i]+k-1,bb[i]*-1}); } sort(ALL(orden)); reverse(ALL(orden)); multiset<ll> vals; queue<ll> era; forn(i,1,n+1){ while(!orden.empty() && orden.back().fst<=i){ pair<ll,ll> aux = orden.back(); //cout<<aux.fst<<" __ "<<aux.snd<<'\n'; if(aux.snd>0) vals.insert(aux.snd*-1); else era.push(aux.snd); orden.pop_back(); } ll val; if(vals.empty()) val=i; else val=abs(*vals.begin()); //cout<<i<<" "<<val<<'\n'; st[0].upd(i,val); //cout<<st[0].query(i,i+1)<<'\n'; /*cout<<"--\n"; for(auto j:vals) cout<<j<<" "; cout<<'\n'; cout<<"--\n";*/ while(!era.empty()){ val = era.front(); vals.erase(vals.find(val)); era.pop(); } } forn(p,1,MAXP){ forn(i,1,n+1){ st[p].upd(i,st[p-1].query(i,st[p-1].query(i,i+1)+1)); //cout<<i<<" "<<p<<" -> "<<st[p].query(i,i+1)<<'\n'; } } } int main(){ cin>>n>>k>>m; mset(aa,-1); mset(bb,-1); forn(i,0,m) cin>>aa[i]>>bb[i]; forn(i,0,MAXP){ st[i]=STree(n+5); } precalc(); ll q; cin>>q; while(q--){ ll ini,fin; cin>>ini>>fin; ll l = ini; ll r = l+1; ll res = 0; for(int p = MAXP-1; p>=0; p--){ ll qry = st[p].query(l,r); if(qry<fin){ r=qry+1; res+=1<<p; } } if(st[MAXP-1].query(ini,ini+1)<fin) res=-2; cout<<res+1<<'\n'; } 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...