Submission #1105230

#TimeUsernameProblemLanguageResultExecution timeMemory
1105230alexddFire (BOI24_fire)C++17
100 / 100
138 ms7340 KiB
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; int n,m; pair<int,int> v[200005]; int prefmax[200005]; int nxt[200005]; int get_ult(int lim) { int st=0,dr=n,ans=0; while(st<=dr) { int mij=(st+dr)/2; if(v[mij].first <= lim) { ans = mij; st = mij+1; } else dr = mij-1; } return ans; } void calc_nxt() { for(int i=1;i<=n;i++) { nxt[i] = prefmax[get_ult(v[i].second)]; if(nxt[i]==i) nxt[i] = -1; //cout<<i<<" "<<nxt[i]<<" nxt\n"; } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>v[i].first>>v[i].second; if(v[i].first > v[i].second) v[i].second += m; } sort(v+1,v+1+n); prefmax[0] = -1; for(int i=1;i<=n;i++) { if(prefmax[i-1]==-1 || v[i].second > v[prefmax[i-1]].second) prefmax[i] = i; else prefmax[i] = prefmax[i-1]; } calc_nxt(); int rez=INF; for(int i=1;i<=n;i++) { if(v[i].second >= m) { int unde = prefmax[get_ult(v[i].second-m)]; if(unde==i) unde = -1; int cur=unde,cnt=1; while(cur!=-1) { cnt++; if(v[cur].second >= v[i].first) break; cur = nxt[cur]; } if(cur!=-1) rez = min(rez, cnt); } } if(rez==INF) rez=-1; cout<<rez; 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...