제출 #1358166

#제출 시각아이디문제언어결과실행 시간메모리
1358166faricaFire (BOI24_fire)C++20
40 / 100
35 ms6220 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 N = 1e6;

bool cmp(pi a, pi b) {
    if(a.first != b.first) return a.first < b.first;
    else return a.second > b.second;
}

void solve() {
    int n, m;
    cin >> n >> m;
    vector<pi>rng(n), intervals;
    for(int i=0; i<n; ++i) {
        int s, e;
        cin >> s >> e;
        rng[i] = {s,e};
        if(s>e) rng[i].second += m;
    }
    sort(rng.begin(), rng.end(), cmp);
    int cnt = -1;
    for(int i=0; i<rng.size(); ++i) {
        int s = rng[i].first, e = rng[i].second;
        if(cnt < e) intervals.push_back({s,e});
        cnt = max(cnt, e);
    }
    n = (int)intervals.size();
    for(pi tmp: intervals)
        intervals.push_back({tmp.first+m, tmp.second+m});
    n *= 2;
    sort(intervals.begin(), intervals.end());
    vi nxtBest(n, n);
    int j = 0;
    for(int i=0; i<n; ++i) {
        while(j < n) {
            if(intervals[i].second < intervals[j].first) break;
            ++j;
        }
        nxtBest[i] = j-1;
    }
    int nxt[n][30];
    for(int i=0; i<n; ++i) for(int j=0; j<30; ++j) nxt[i][j] = n;
    for(int i=n-2; i>=0; --i) {
        nxt[i][0] = nxtBest[i];
        if(nxt[i][0] == i) nxt[i][0] = n;
        for(int j=1; j<30; ++j) {
            if(nxt[i][j-1] == n) break;
            nxt[i][j] = nxt[nxt[i][j-1]][j-1];
        }
    }
    int ans = n+1;
    for(int i=0; i<n; ++i) {
        int s = i, k = 1;
        for(int j=29; j>=0; --j) {
            if(nxt[s][j] < n && intervals[nxt[s][j]].second - intervals[i].first < m) {
                k += (1<<j);
                s = nxt[s][j];
            }
        }
        if(nxt[s][0] < n && intervals[nxt[s][0]].second - intervals[i].first >= m) ans = min(ans, k+1);
    }
    if(ans == n+1) ans = -1;
    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();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…