제출 #651603

#제출 시각아이디문제언어결과실행 시간메모리
651603inksamuraiEvent Hopping (BOI22_events)C++17
25 / 100
1595 ms41324 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); } }; // int op(int l,int r){return min(l,r);} // int e(){return inf;} struct dat{ int l,r,id; dat(int _l=-1,int _r=-1,int _id=-1): l(_l),r(_r),id(_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; rep(j,ln){ segtree curseg(si); rep(i,si){ curseg.set(i,inf); } segs.pb(curseg); } 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)); } rng(j,1,ln){ rep(i,n){ int r=a[i].r; int l=segs[j-1].get(r); int val=segs[j-1].prod(l,r+1); int old_val=segs[j-1].get(r); segs[j].set(r,min(old_val,val)); } } vec(segtree) adsegs; rep(j,ln){ segtree curseg(si); rep(i,si){ curseg.set(i,inf); } adsegs.pb(curseg); } rep(j,ln){ rep(i,n){ int r=a[i].r; if(j==0){ adsegs[j].set(r,segs[j].get(r)); }else{ int l=adsegs[j-1].get(r); adsegs[j].set(r,segs[j].prod(l,r+1)); } } } // 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; // print(segs[1].prod(go,r+1)); // rep(_,4){ // res+=1; // int ngo=segs[0].prod(go,r+1); // if(go<=need) break; // if(ngo==go) break; // go=ngo; // } // print(go); for(int j=ln-1;j>=0;j--){ int pok=go<=need; if(j){ int val=adsegs[j-1].prod(go,r+1); if(val<=need) pok=1; } // 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){ res+=1<<j; go=segs[j].prod(go,r+1); } } if(go>need) return inf; // print(go); return res; }; // af(5,0); 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...