Submission #603799

#TimeUsernameProblemLanguageResultExecution timeMemory
603799DanerZeinEvent Hopping (BOI22_events)C++14
20 / 100
1587 ms40688 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> ii; typedef pair<ii,int> iii; typedef vector<ii> vii; typedef vector<int> vi; const int MIN_N=5010; const int MAX_N=1e5+10; const int MAX=1e9; vector<vi> G; vii ev; int dis[MIN_N][MIN_N]; int ans[MAX_N]; int n; bool isq[MAX_N]; void bfs(int u){ for(int i=0;i<n;i++) dis[u][i]=MAX; dis[u][u]=0; isq[u]=1; queue<int> q; q.push(u); while(!q.empty()){ int x=q.front(); q.pop(); isq[x]=0; for(auto &v:G[x]){ if(dis[u][v]>dis[u][x]+1){ dis[u][v]=dis[u][x]+1; if(!isq[v]){ isq[v]=1; q.push(v); } } } } } int in[MAX_N]; int pa[MAX_N][32]; int le[MAX_N]; void dfs(int u,int p){ pa[u][0]=p; for(int i=1;i<=20;i++){ pa[u][i]=pa[pa[u][i-1]][i-1]; } for(auto &v:G[u]){ if(v!=p) { le[v]=le[u]+1; dfs(v,u); } } } int father(int u,int v){ int dif=le[u]-le[v]; if(dif<0) return -1; for(int i=0;i<=20;i++){ if(dif&(1<<i)) u=pa[u][i]; } if(u!=v) return -1; return dif; } int con[MAX_N]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int q; cin>>n>>q; bool t2=0; if(n<=5000) t2=1; vii enp; for(int i=0;i<n;i++){ int a,b; cin>>a>>b; ev.push_back(ii(a,b)); enp.push_back(ii(b,i)); con[i]=i; } G.resize(n+1); if(t2){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(ev[j].first<=ev[i].second && ev[i].second<=ev[j].second){ G[i].push_back(j); } } } for(int i=0;i<n;i++) bfs(i); } else{ sort(enp.begin(),enp.end()); for(int i=0;i<n-1;i++){ if(enp[i].first==enp[i+1].first){ con[enp[i].second]=enp[i+1].second; con[enp[i+1].second]=enp[i].second; } } for(int i=0;i<n;i++){ auto it=lower_bound(enp.begin(),enp.end(),ii(ev[i].first,0)); int l=it-enp.begin(); it=upper_bound(enp.begin(),enp.end(),ii(ev[i].second+1,0)); int r=it-enp.begin(); for(int j=l;j<r;j++){ if(i!=enp[j].second){ G[i].push_back(enp[j].second); in[enp[j].second]=1; } } } for(int i=0;i<n;i++){ if(!in[i] || con[i]!=i){ dfs(i,i); } } } while(q--){ int s,e; cin>>s>>e; s--; e--; if(t2){ if(dis[s][e]>=MAX) cout<<"impossible\n"; else cout<<dis[s][e]<<endl; } else{ int ans=father(s,e); if(ans!=-1) cout<<ans<<endl; else{ int ca=father(s,con[e])+1; if(ca!=0) cout<<ca<<endl; else cout<<"impossible\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...