제출 #1356569

#제출 시각아이디문제언어결과실행 시간메모리
1356569AvianshFire (BOI24_fire)C++20
100 / 100
251 ms89004 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

///max segtree
struct segTree{
    array<int,2> *st;
    array<int,2>unite(array<int,2>a,array<int,2>b){
        return max(a,b);
    }
    void build(int l, int r, int ind){
        if(l==r){
            st[ind][0]=0;
            st[ind][1]=l;
            return;
        }
        int mid = (l+r)/2;
        build(l,mid,ind*2+1);
        build(mid+1,r,ind*2+2);
        st[ind]=unite(st[ind*2+1],st[ind*2+2]);
    }
    segTree(int n){
        int x = ceil(log2(n));
        x++;
        st=new array<int,2>[(1<<x)];
        build(0,n-1,0);
    }
    void update(int l, int r, int i, int val, int ind){
        if(i<l||i>r)
            return;
        if(l==r){
            st[ind][0]=val;
            return;
        }
        int mid = (l+r)/2;
        update(l,mid,i,val,ind*2+1);
        update(mid+1,r,i,val,ind*2+2);
        st[ind]=unite(st[ind*2+1],st[ind*2+2]);
    }
    array<int,2>query(int l, int r, int s, int e, int ind){
        if(e<l||s>r){
            return {0,-1};
        }
        if(s<=l&&r<=e){
            return st[ind];
        }
        int mid = (l+r)/2;
        return unite(query(l,mid,s,e,ind*2+1),query(mid+1,r,s,e,ind*2+2));
    }
};

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    array<int,2>init[n];
    for(int i = 0;i<n;i++){
        cin >> init[i][0];
        cin >> init[i][1];
    }
    vector<array<int,2>>arr;
    for(int i = 0;i<n;i++){
        if(init[i][0]<=init[i][1]){
            ///day worker
            arr.push_back(init[i]);
            init[i][0]+=m;
            init[i][1]+=m;
            arr.push_back(init[i]);
        }
        else{
            ///night worker
            init[i][1]+=m;
            arr.push_back(init[i]);
        }
    }
    sort(arr.begin(),arr.end());
    ///sorted on starts
    n=arr.size();
    const int lg = 20;
    int par[n][lg];
    segTree st(n);
    for(int i = n-1;i>=0;i--){
        st.update(0,n-1,i,arr[i][1],0);
        int endp = lower_bound(arr.begin(),arr.end(),(array<int,2>){arr[i][1]+1,-1})-arr.begin()-1;
        array<int,2>a = st.query(0,n-1,i,endp,0);
        par[i][0]=a[1];
    }
    for(int i = n-1;i>=0;i--){
        for(int j = 1;j<lg;j++){
            par[i][j]=par[par[i][j-1]][j-1];
        }
    }
    int ans = 1e9;
    for(int i = n-1;i>=0;i--){
        int mne = arr[i][0]+m;
        ///find first in parents who excess mne
        int curr = i;
        int cnt = 1;
        for(int j = lg-1;j>=0;j--){
            if(arr[par[curr][j]][1]>=mne)
                continue;
            cnt+=(1<<j);
            curr=par[curr][j];
        }
        curr=par[curr][0];
        cnt++;
        if(arr[curr][1]>=mne){
            ans=min(ans,cnt);
        }
    }
    if(ans==1e9){
        cout << -1;
    }
    else{
        cout << ans;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…