Submission #1182476

#TimeUsernameProblemLanguageResultExecution timeMemory
1182476gygFire (BOI24_fire)C++20
40 / 100
2099 ms107076 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define arr array 
#define vec vector 
const int N = 2e5 + 5, LG = 22, INF = 1e12;

int n, m;
arr<int, N> l, r;

arr<arr<vec<int>, LG>, N> jmp;
void jmp_cmp() {
    jmp[0][0] = {0, 0};
    for (int i = 1; i <= n; i++) {
        jmp[i][0] = {0, 0};
        for (int j = 1; j <= n; j++) {
            if (i == j) continue;
            if (l[i] <= r[i] && l[j] <= r[j]) {
                if (l[j] < l[i] || l[j] > r[i]) continue;
                if (r[j] <= r[i]) continue;   
                jmp[i][0] = max(jmp[i][0], {r[j] - r[i], j});
            } else if (l[i] <= r[i] && l[j] > r[j]) {
                if (l[j] < l[i] || l[j] > r[i]) continue;
                jmp[i][0] = max(jmp[i][0], {r[j] + m - r[i], j});
            } else if (l[i] > r[i] && l[j] <= r[j]) {
                if (l[j] > r[i]) continue;
                if (r[j] <= r[i]) continue;
                jmp[i][0] = max(jmp[i][0], {r[j] - r[i], j});
            } else {
                if (l[j] < l[i]) continue;
                if (r[j] <= r[i]) continue;
                jmp[i][0] = max(jmp[i][0], {r[j] - r[i], j});
            }
        }
    }

    // for (int i = 1; i <= n; i++) {
    //     cout << i << ": " << jmp[i][0][0] << " " << jmp[i][0][1] << '\n';
    // }

    for (int i = 1; i <= 20; i++) {
        for (int j = 0; j <= n; j++) {
            vec<int> x = jmp[j][i - 1];
            vec<int> y = jmp[x[1]][i - 1];
            jmp[j][i] = {x[0] + y[0], y[1]};
        }
    }
}

// i changes
int lft(int i) {
    int rq = m - (r[i] - l[i]);
    // cout << i << ": " << rq << '\n';

    int cr = 0, ans = 1;
    for (int j = 20; j >= 0; j--) {
        vec<int> x = jmp[i][j];
        if (x[1] == 0) continue;
        if (cr + x[0] >= rq) continue;
        i = x[1], cr += x[0], ans += (1 << j);
    }
    
    vec<int> x = jmp[i][0];
    if (x[1] == 0) return INF;
    ans++;
    return ans;
}

void ans_cmp() {
    int ans = INF;
    for (int i = 1; i <= n; i++)
        ans = min(ans, lft(i));
    cout << ((ans == INF) ? -1 : ans) << '\n';
}

signed main() {
    // freopen("in", "r", stdin);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> l[i] >> r[i];

    jmp_cmp();
    ans_cmp();
}
#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...