Submission #1105228

#TimeUsernameProblemLanguageResultExecution timeMemory
1105228alexddFire (BOI24_fire)C++17
0 / 100
2093 ms3300 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)]; //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(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=-1,mxm=-1; for(int j=1;j<=get_ult(v[i].second-m);j++) { if(v[j].second > mxm) { mxm = v[j].second; unde = j; } } //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...