Submission #1361261

#TimeUsernameProblemLanguageResultExecution timeMemory
1361261NewtonabcFire (BOI24_fire)C++20
100 / 100
79 ms38160 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int li[N],ri[N];
int d[N][20];
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m; cin>>n >>m;
    vector<pair<int,int>> v;
    for(int i=1;i<=n;i++){
        int l,r; cin>>l >>r;
        if(l>r) r+=m;
        v.push_back({l,r});
    }
    sort(v.begin(),v.end());
    int id=0;
    int mx=INT_MIN;
    for(auto [l,r]:v){
        if(r<=mx) continue;
        li[id]=l,ri[id]=r;
        id++;
        mx=r;
    }
    // for(int i=0;i<id;i++){
    //     cout<<li[i] <<" " <<ri[i] <<"\n";
    // }
    for(int i=0;i<id;i++){
        int fi=lower_bound(ri,ri+id,li[i])-ri;
        d[i][0]=fi;
        //cout<<"pt";
        //cout<<i <<" " <<fi <<"\n";
    }
    for(int i=1;i<20;i++) for(int j=0;j<id;j++) d[j][i]=d[d[j][i-1]][i-1];
    int ans=INT_MAX;
    for(int i=0;i<id;i++){
        int st=ri[i],now=i,cnt=0;
        //cout<<st <<" " <<ri[i] <<" ";
        for(int j=19;j>=0;j--){
            int cd=d[now][j];
            if(st-li[cd]+1LL<m) now=cd,cnt+=(1<<j);
        }
        //cout<<st <<" " <<li[i] <<"\n";
        //cout<<i <<" " <<cnt <<" " <<li[now] <<" " <<st <<"\n";
        cnt++,now=d[now][0];
        if(st-li[now]+1LL>=m) ans=min(ans,cnt+1);
    }
    if(ans==INT_MAX) cout<<-1;
    else cout<<ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...