제출 #651477

#제출 시각아이디문제언어결과실행 시간메모리
651477inksamuraiEvent Hopping (BOI22_events)C++17
0 / 100
1567 ms33100 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define rng(i,c,n) for(int i=c;i<n;i++) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3CZAtRo ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} const int inf=1e9; struct segtree{ int n; vi seg; segtree(int _n=0){init(_n);} void init(int _n){ n=_n; int si=1; while(si<=n) si*=2; si*=2; seg.clear(); seg=vi(si,inf); } void set(int node,int l,int r,int pos,int x){ if(l==r-1){ seg[node]=x; return; } int m=(l+r)/2; if(pos<m){ set(node*2+1,l,m,pos,x); }else{ set(node*2+2,m,r,pos,x); } seg[node]=min(seg[node*2+1],seg[node*2+2]); } void set(int pos,int x){ set(0,0,n,pos,x); } int prod(int node,int l,int r,int _l,int _r){ if(l>=_r or r<=_l){ // _e return inf; } if(_l<=l and r<=_r){ return seg[node]; } int m=(l+r)/2; return min(prod(node*2+1,l,m,_l,_r),prod(node*2+2,m,r,_l,_r)); } int prod(int l,int r){ return prod(0,0,n,l,r); } int get(int i){ return prod(i,i+1); } }; struct dat{ int l,r,id; dat(int _l=-1,int _r=-1,int _id=-1): l(_l),r(_r),id(_id){} bool operator<(const dat&a)const{ return tuple<int,int,int>(a.r,a.l,a.id)<tuple<int,int,int>(r,l,id); } }; signed main(){ _3CZAtRo; int n,q; cin>>n>>q; vec(dat) a(n); rep(i,n){ cin>>a[i].l>>a[i].r; a[i].id=i; } vec(vec(pii)) qry(n); rep(_,q){ int s,t; cin>>s>>t; qry[t-1].pb(pii(s-1,_)); } vi tmp; rep(i,n){ tmp.pb(a[i].l); tmp.pb(a[i].r); } sort(tmp.begin(),tmp.end()); tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end()); int si=sz(tmp); rep(i,n){ a[i].l=lower_bound(tmp.begin(),tmp.end(),a[i].l)-tmp.begin(); a[i].r=lower_bound(tmp.begin(),tmp.end(),a[i].r)-tmp.begin(); } const int ln=17; vec(segtree) segs(ln); rep(j,ln){ segs[j].init(si); } vec(vi) spr(ln,vi(n,inf)); { rep(i,n){ int l=a[i].l,r=a[i].r; int val=segs[0].get(r); segs[0].set(r,min(val,l)); spr[0][i]=l; } } rng(j,1,ln){ rep(i,n){ int l=spr[j-1][i]; int r=a[i].r; int val=segs[j-1].prod(l,r+1); spr[j][i]=val; int old_val=segs[j-1].get(r); segs[j].set(r,min(old_val,val)); } } // print(" output points "); // for(auto p:a){ // print(p.l,p.r); // } // print("....."); auto af=[&](int i,int need)->int{ int res=1; int go=a[i].l; int r=a[i].r; // print(need,r); if(r<need){ return inf; } if(go<=need and need<=r){ return 1; } // rep(_,10){ // res+=1; // go=segs[0].prod(go,r+1); // if(go<=need) break; // } for(int j=ln-1;j>=0;j--){ int ngo=go,pok=0; for(int nj=j-1;nj>=0;nj--){ int val=segs[nj].prod(ngo,r+1); if(val<=need)pok=1; ngo=val; } if(!pok){ // print(j); if(j) res+=1<<(j-1); else res+=1; go=segs[j].prod(go,r+1); } } if(go>need) return inf; // print(go); return res; }; vi pns(q,inf); rep(i,n){ for(auto p:qry[i]){ if(p.fi==i){ pns[p.se]=0; }else{ pns[p.se]=af(i,a[p.fi].r); } } } rep(i,q){ if(pns[i]==inf){ cout<<"impossible\n"; }else{ cout<<pns[i]<<"\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...