Submission #1281448

#TimeUsernameProblemLanguageResultExecution timeMemory
1281448lightentheshadowFire (BOI24_fire)C++20
100 / 100
114 ms20988 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxN = 2e5 + 5;
pair<int, int> p[maxN];
int s[maxN], jump[20][maxN];

struct node {
    int val, id;
} st[maxN << 4];

node Merge(node A, node B) {
    if (A.val >= B.val) return A;
    return B;
}

void build(int id, int l, int r) {
    if (l == r) {
        st[id].val = p[l].second;
        st[id].id = l;
        return ;
    }

    int mid = (l + r) >> 1;

    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);

    st[id] = Merge(st[id << 1], st[id << 1 | 1]);
}

node get(int id, int l, int r, int u, int v) {
    if (v < l || r < u) return {-100, 0};

    if (u <= l && r <= v) return st[id];

    int mid = (l + r) >> 1;

    node A = get(id << 1, l, mid, u, v);
    node B = get(id << 1 | 1, mid + 1, r, u, v);

    return Merge(A, B);
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        cin >> p[i].first >> p[i].second;
        if (p[i].first > p[i].second) p[i].second += m;
    }

    sort(p + 1, p + n + 1);
    build(1, 1, n);
    for (int i = 1; i <= n; i++)
        s[i] = p[i].first;

    for (int i = 1; i <= n; i++) {
        int l = lower_bound(s + 1, s + n + 1, p[i].first) - s;
        int r = upper_bound(s + 1, s + n + 1, p[i].second) - s - 1;
        node res = get(1, 1, n, l, r);
        if (res.val <= p[i].second) continue;
        jump[0][i] = res.id;
    }

    for (int k = 1; k <= 17; k++)
        for (int i = 1; i <= n; i++)
            jump[k][i] = jump[k - 1][jump[k - 1][i]];

    int ans = 1e9;
    for (int i = 1; i <= n; i++) {
        int id = i, goal = p[i].first + m, res = 0;
        for (int k = 17; k >= 0; k--) {
            int nxt = jump[k][id];
            if (nxt == 0 || p[nxt].second >= goal) continue;
            res += (1 << k);
            id = nxt;
        }

        res++; id = jump[0][id];
        if (p[id].second >= goal) ans = min(ans, res);
    }

    if (ans == 1e9) cout << -1 << '\n';
        else cout << ans + 1 << '\n';

    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...