제출 #1359254

#제출 시각아이디문제언어결과실행 시간메모리
1359254glupanFire (BOI24_fire)C++20
100 / 100
119 ms53808 KiB
#include<bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using pi = pair<int,int>;
typedef long long ll;
#define debug(x) cout << #x << " = " << x << "\n";
#define vdebug(a) cout << #a << " = "; for(auto x: a) cout << x << " "; cout << "\n";

const int MOD = 998244353;
const int MAXN = 4e5;
const int MAXK = 21;

ll n,m;
ll s[MAXN],e[MAXN];
int nextB[MAXN];
int lift[MAXN][MAXK];

void solve() {
    cin >> n >> m;
    for(int i=0; i<n; i++) cin >> s[i] >> e[i];
    for(int i=0; i<n; i++) {
        if(s[i] > e[i]) e[i] += m;
    }
    for(int i=0; i<n; i++) {
        s[i+n] = s[i]+m;
        e[i+n] = e[i]+m;
    }
    n*=2;
    int cnt=0;
    vector<pair<ll,ll>>intervals;
    for(int i=0; i<n; i++) intervals.push_back({s[i], -e[i]});
    sort(intervals.begin(), intervals.end());
    ll maxEnd = -1;
    for(auto interval : intervals) {
       ll start = interval.first, end = -interval.second;
       if(end <= maxEnd) continue;
       maxEnd = end;
       s[cnt] = start;
       e[cnt] = end;
       cnt++;
    }
    n=cnt;
    vector<pair<ll,int>>Intervals;
    for(int i=0; i<n; i++) Intervals.push_back({s[i], i});
    sort(Intervals.begin(), Intervals.end());
    int idx=0;
    for(auto interval : Intervals) {
        int i = interval.second;
        while(idx < n) {
            int intervalId = Intervals[idx].second;
            if(s[intervalId] > e[i]) break;
            idx++;
        }
        nextB[i] = Intervals[idx-1].second;
    }
    for(int i=0; i<n; i++) lift[i][0] = nextB[i];
    for(int k=1; k<MAXK; k++) {
        for(int i=0; i<n; i++) lift[i][k] = lift[lift[i][k-1]][k-1];
    }
    int ans=-1;
    for(int i=0; i<n; i++) {
        int TMP;

        ll startTime = s[i];
        int cntJumps=0,cur = i;
        for(int j=MAXK-1; j>=0; j--) {
            int jumpTo = lift[cur][j];
            if(e[jumpTo] < startTime + m) {
                cntJumps += (1 << j);
                cur = jumpTo;
            }
        }
        cntJumps++;
        cur = lift[cur][0];
        if(e[cur] < startTime+m) TMP = -1;
        else TMP = cntJumps+1;

        if(TMP == -1) continue;
        if(ans == -1 or TMP < ans) ans=TMP;
    }
    cout << ans << endl;
}

int main(){
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int tc=1;
    while(tc--) solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…