제출 #1280691

#제출 시각아이디문제언어결과실행 시간메모리
1280691LudisseyEvent Hopping (BOI22_events)C++20
100 / 100
585 ms128676 KiB
#include <bits/stdc++.h> #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define int long long using namespace std; const int LOG=24; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,q; cin >> n >> q; vector<pair<int,int>> a(n); vector<vector<int>> mn(n,vector<int>(LOG,0)); set<int> evs; for (int i = 0; i < n; i++) cin >> a[i].first >> a[i].second, evs.insert(a[i].first), evs.insert(a[i].second); unordered_map<int,int> um; int k=0; for (auto u : evs) um[u]=k++; vector<vector<pair<int,int>>> mn_table(k, vector<pair<int,int>>(LOG,{1e12,-1})); for (int i = 0; i < n; i++) { if(a[i].first< mn_table[um[a[i].second]][0].first) mn_table[um[a[i].second]][0]={a[i].first,i}; } for (int j = 1; j < LOG; j++) { for (int i = 0; i+(1<<(j-1)) < k; i++) { if(mn_table[i][j-1].first<mn_table[i+(1<<(j-1))][j-1].first) mn_table[i][j]=mn_table[i][j-1]; else mn_table[i][j]=mn_table[i+(1<<(j-1))][j-1]; } } for (int i = 0; i < n; i++) { int l=um[a[i].first],r=um[a[i].second]; int lg=log2(r-l+1); mn[i][0]=i; if(mn_table[l][lg].first<mn_table[r-(1<<lg)+1][lg].first) mn[i][0]=mn_table[l][lg].second; else if(mn_table[r-(1<<lg)+1][lg].first<1e12) mn[i][0]=mn_table[r-(1<<lg)+1][lg].second; } for (int j = 1; j < LOG; j++) { for (int i = 0; i < n; i++) { mn[i][j]=mn[mn[i][j-1]][j-1]; } } vector<pair<int,int>> qrs(q); for (int i = 0; i < q; i++) cin >> qrs[i].first >> qrs[i].second; for (int i = 0; i < q; i++) { int s=qrs[i].first-1,e=qrs[i].second-1; if(s==e){ cout << 0 << "\n"; continue; } if(a[s].second>a[e].second){ cout << "impossible\n"; continue; } else if(a[s].second>=a[e].first){ cout << 1 << "\n"; continue; } int sm=0; for (int j = LOG-1; j >= 0; j--) { if(a[mn[e][j]].first>a[s].second){ sm+=(1<<j); e=mn[e][j]; } } e=mn[e][0]; if(a[e].first>a[s].second){ cout << "impossible\n"; continue; } sm+=2; cout << sm << "\n"; } return 0; }
#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...