Submission #868538

#TimeUsernameProblemLanguageResultExecution timeMemory
868538Dec0DeddEvent Hopping (BOI22_events)C++14
30 / 100
93 ms33992 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int N = 1e5+10; const int K = 20; const int INF = 1e6+10; int up[K][N], d[K][N], s[N], lf[N], e[N], mx[N], idx[N], n, q; vector<pii> v; vector<int> add[N], rm[N]; bool cmp(pii a, pii b) { if (a.first == b.first) return s[a.second] < s[b.second]; else return a.first < b.first; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cin>>n>>q; for (int i=0; i<n; ++i) { cin>>s[i]>>e[i]; v.push_back({e[i], i}); } sort(v.begin(), v.end(), cmp); for (int i=0; i<n; ++i) { int j=lower_bound(v.begin(), v.end(), make_pair(s[v[i].second], -1))-v.begin(); lf[i]=j; add[lf[i]].push_back(v[i].second); rm[i+1].push_back(v[i].second); } for (int i=0; i<n; ++i) idx[v[i].second]=i; multiset<pii> ms; for (int i=0; i<n; ++i) { for (auto u : add[i]) ms.insert({e[u], idx[u]}); for (auto u : rm[i]) ms.erase(ms.find({e[u], idx[u]})); mx[i]=ms.rbegin()->second; } for (int i=n-1; i>=0; --i) { up[0][i]=mx[i], d[0][i]=(mx[i] != i); for (int j=1; j<K; ++j) { up[j][i]=up[j-1][up[j-1][i]]; d[j][i]=d[j-1][i]+d[j-1][up[j-1][i]]; } } /* cout<<"v: "; for (int i=0; i<n; ++i) cout<<v[i].first<<" "; cout<<"\n"; cout<<"idx: "; for (int i=0; i<n; ++i) cout<<idx[i]<<" "; cout<<"\n"; cout<<"mx: "; for (int i=0; i<n; ++i) cout<<mx[i]<<" "; cout<<"\n"; */ while (q--) { int l, r; cin>>l>>r; --l, --r; l=idx[l], r=idx[r]; //cout<<"QUE "<<l<<", "<<r<<"\n"; if (l == r) { cout<<0<<"\n"; continue; } if (v[r].first < v[l].first) { cout<<"impossible\n"; continue; } int ans=0; for (int j=K-1; j>=0; --j) { //cout<<"HERE "<<up[j][l]<<"\n"; if (up[j][l] <= r) ans+=d[j][l], l=up[j][l]; } if (l == r) ans+=0; else { if (s[v[r].second] <= e[v[l].second] && e[v[l].second] <= e[v[r].second]) ++ans, l=r; else { cout<<"impossible\n"; continue; } } assert(l == r); cout<<ans<<"\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...