Submission #1203249

#TimeUsernameProblemLanguageResultExecution timeMemory
1203249AlgorithmWarriorFire (BOI24_fire)C++20
100 / 100
169 ms20964 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=2e5+5;
int n,m;
struct interval{
    int l,r;
}v[MAX];

void read(){
    cin>>n>>m;
    int i;
    for(i=1;i<=n;++i){
        cin>>v[i].l>>v[i].r;
        if(v[i].l>v[i].r)
            v[i].r+=m;
    }
}

struct event{
    int ind;
    bool tip; /// 1 0
    bool operator<(event ot){
        int nr1=((tip)?v[ind].l:v[ind].r);
        int nr2=((ot.tip)?v[ot.ind].l:v[ot.ind].r);
        if(nr1!=nr2)
            return nr1<nr2;
        return tip>ot.tip;
    }
}ev[2*MAX];

int const LOG=20;
int rmq[MAX][LOG];

void put_fathers(){
    int i;
    for(i=1;i<=n;++i){
        ev[2*i-1]={i,1};
        ev[2*i]={i,0};
    }
    sort(ev+1,ev+2*n+1);
    int best=0;
    for(i=1;i<=2*n;++i){
        int ind=ev[i].ind;
        if(ev[i].tip){
            if(v[best].r<v[ind].r)
                best=ind;
        }
        else
            rmq[ind][0]=best;
    }
}

void build_rmq(){
    int i,j;
    for(j=1;j<LOG;++j)
        for(i=1;i<=n;++i)
            rmq[i][j]=rmq[rmq[i][j-1]][j-1];
}

int const INF=1e9;

int bin_lift(int nod){
    int capat=v[nod].l+m;
    int anc=0;
    int bit;
    for(bit=LOG-1;bit>=0;--bit)
        if(v[rmq[nod][bit]].r<capat){
            anc+=(1<<bit);
            nod=rmq[nod][bit];
        }
    nod=rmq[nod][0];
    if(v[nod].r>=capat)
        return anc+2;
    return INF;
}

void minself(int& x,int val){
    if(x>val)
        x=val;
}

int solve(){
    int i;
    int rasp=INF;
    for(i=1;i<=n;++i)
        minself(rasp,bin_lift(i));
    if(rasp<INF)
        return rasp;
    return -1;
}

void write(int ans){
    cout<<ans;
}

int main()
{
    read();
    put_fathers();
    build_rmq();
    write(solve());
    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...