Submission #599499

#TimeUsernameProblemLanguageResultExecution timeMemory
599499alexander707070Event Hopping (BOI22_events)C++14
10 / 100
1589 ms136928 KiB
#include<bits/stdc++.h> #define MAXN 400007 using namespace std; struct event{ long long s; long long e; int id; inline friend bool operator < (event fr,event sc){ if(fr.e!=sc.e)return fr.e<sc.e; return fr.s<=sc.s; } }; int n,cnt,q,S,E,ans; int st[MAXN],et[MAXN]; int parent[MAXN]; event e[MAXN]; vector<int> w; map<int,int> mp; pair<int,int> mins[8*MAXN]; pair<int,int> best(pair<int,int> fr,pair<int,int> sc){ if(fr.second<=sc.second)return fr; return sc; } void update(int v,int l,int r,int pos,int val,int id){ if(l==r){ if(val<mins[v].second or val==10000000){ mins[v]={id,val}; } }else{ int tt=(l+r)/2; if(pos<=tt)update(2*v,l,tt,pos,val,id); else update(2*v+1,tt+1,r,pos,val,id); mins[v]=best(mins[2*v],mins[2*v+1]); } } pair<int,int> getmin(int v,int l,int r,int ll,int rr){ if(ll>rr)return {0,100000000}; if(l==ll and r==rr){ return mins[v]; }else{ int tt=(l+r)/2; return best( getmin(2*v,l,tt,ll,min(tt,rr)) , getmin(2*v+1,tt+1,r,max(tt+1,ll),rr) ); } } int dp[MAXN][20]; void calc(){ for(int f=0;f<20;f++){ for(int i=1;i<=n;i++){ if(f==0)dp[i][f]=parent[i]; else dp[i][f]=dp[dp[i][f-1]][f-1]; } } } int bin(int id,int id2){ if(id==id2)return 0; if(et[id]<st[id2])return -1; if(et[id2]>et[id])return -1; if(et[id2]>=st[id])return 1; int res=0; for(int i=19;i>=0;i--){ if(dp[id][i]!=0 and st[dp[id][i]]>et[id2]){ id=dp[id][i]; res+=(1<<i); } } if(parent[id]==0)return -1; if(parent[id]==id2)return res+1; return res+2; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++){ cin>>st[i]>>et[i]; e[i]={st[i],et[i],i}; w.push_back(e[i].s); w.push_back(e[i].e); } sort(w.begin(),w.end()); for(int i=0;i<w.size();i++){ if(i>0 and w[i]!=w[i-1])cnt++; mp[w[i]]=cnt; } for(int i=1;i<=n;i++){ e[i].s=mp[e[i].s]; e[i].e=mp[e[i].e]; } for(int i=0;i<=cnt;i++){ //update(1,0,cnt,i,10000000,0); mins[i]={0,10000000}; } sort(e+1,e+n+1); for(int i=1;i<=n;i++){ pair<int,int> sol={0,100000000}; for(int f=e[i].s;f<=e[i].e;f++){ sol=best(sol,mins[f]); } //parent[e[i].id]=getmin(1,0,cnt,e[i].s,e[i].e).first; parent[e[i].id]=sol.first; //update(1,0,cnt,e[i].e,e[i].s,e[i].id); mins[e[i].e]=best(mins[e[i].e],{e[i].id,e[i].s}); } calc(); for(long long i=1;i<=100000000;i++){ S=(E+3928)%30009; E=(S+2472)%20300; } for(int i=1;i<=q;i++){ cin>>S>>E; ans=bin(E,S); if(ans==-1)cout<<"impossible\n"; else cout<<ans<<"\n"; } return 0; }

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:99:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |     for(int i=0;i<w.size();i++){
      |                 ~^~~~~~~~~
#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...