Submission #1022036

#TimeUsernameProblemLanguageResultExecution timeMemory
1022036huutuanFire (BOI24_fire)C++14
100 / 100
298 ms139204 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N=1e6+10, LG=20;
int n, m;
pair<int, int> a[N];
int jump[LG][N];

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> m;
   vector<int> v;
   for (int i=1; i<=n; ++i){
      cin >> a[i].first >> a[i].second;
      v.push_back(a[i].first);
      v.push_back(a[i].second);
      v.push_back(a[i].first+m);
      v.push_back(a[i].second+m);
      if (a[i].first>a[i].second) a[i].second+=m;
   }
   sort(v.begin(), v.end()); v.resize(unique(v.begin(), v.end())-v.begin());
   int _m=m;
   m=v.size();
   for (int i=0; i<m; ++i) jump[0][i]=i;
   for (int i=1; i<=n; ++i){
      int l=lower_bound(v.begin(), v.end(), a[i].first)-v.begin();
      jump[0][l]=max<int>(jump[0][l], lower_bound(v.begin(), v.end(), a[i].second)-v.begin());
   }
   for (int i=1; i<m; ++i) jump[0][i]=max(jump[0][i], jump[0][i-1]);
   for (int i=1; i<LG; ++i) for (int j=0; j<m; ++j) jump[i][j]=jump[i-1][jump[i-1][j]];
   int ans=1e9;
   for (int i=1; i<=n; ++i){
      int l=lower_bound(v.begin(), v.end(), a[i].first)-v.begin();
      int r=lower_bound(v.begin(), v.end(), a[i].first+_m)-v.begin();
      int cur=0;
      for (int j=LG-1; j>=0; --j) if (jump[j][l]<r){
         cur+=1<<j;
         l=jump[j][l];
      }
      ans=min(ans, cur+1);
   }
   cout << (ans>n?-1:ans) << '\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...