1 条题解

  • 0
    @ 2026-11-2 13:11:11

    旅馆房间管理(Hotel G) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int n, m;
    vector<int> pre, suf, mx, tag;
    
    void pull(int u, int l, int r) {
        int mid = (l + r) >> 1;
        int lenL = mid - l + 1;
        int lenR = r - mid;
        pre[u] = pre[u << 1] + (pre[u << 1] == lenL ? pre[u << 1 | 1] : 0);
        suf[u] = suf[u << 1 | 1] + (suf[u << 1 | 1] == lenR ? suf[u << 1] : 0);
        mx[u] = max({mx[u << 1], mx[u << 1 | 1], suf[u << 1] + pre[u << 1 | 1]});
    }
    
    void apply(int u, int l, int r, int t) {
        // t = 0: empty, t = 1: occupied
        int val = (t == 0) ? (r - l + 1) : 0;
        pre[u] = suf[u] = mx[u] = val;
        tag[u] = t;
    }
    
    void push(int u, int l, int r) {
        if (tag[u] != -1) {
            int mid = (l + r) >> 1;
            apply(u << 1, l, mid, tag[u]);
            apply(u << 1 | 1, mid + 1, r, tag[u]);
            tag[u] = -1;
        }
    }
    
    void build(int u, int l, int r) {
        tag[u] = -1;
        pre[u] = suf[u] = mx[u] = r - l + 1;
        if (l == r) return;
        int mid = (l + r) >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
    }
    
    void update(int u, int l, int r, int ql, int qr, int t) {
        if (ql <= l && r <= qr) {
            apply(u, l, r, t);
            return;
        }
        push(u, l, r);
        int mid = (l + r) >> 1;
        if (ql <= mid) update(u << 1, l, mid, ql, qr, t);
        if (qr > mid) update(u << 1 | 1, mid + 1, r, ql, qr, t);
        pull(u, l, r);
    }
    
    int queryFirst(int u, int l, int r, int x) {
        if (l == r) return l;
        push(u, l, r);
        int mid = (l + r) >> 1;
        if (mx[u << 1] >= x) return queryFirst(u << 1, l, mid, x);
        if (suf[u << 1] + pre[u << 1 | 1] >= x) return mid - suf[u << 1] + 1;
        return queryFirst(u << 1 | 1, mid + 1, r, x);
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        if (!(cin >> n >> m)) return 0;
        pre.assign(4 * n + 5, 0);
        suf.assign(4 * n + 5, 0);
        mx.assign(4 * n + 5, 0);
        tag.assign(4 * n + 5, -1);
        build(1, 1, n);
        for (int i = 0; i < m; ++i) {
            int op;
            cin >> op;
            if (op == 1) {
                int x;
                cin >> x;
                if (mx[1] < x) {
                    cout << 0 << "\n";
                } else {
                    int p = queryFirst(1, 1, n, x);
                    cout << p << "\n";
                    update(1, 1, n, p, p + x - 1, 1);
                }
            } else {
                int x, y;
                cin >> x >> y;
                update(1, 1, n, x, min(n, x + y - 1), 0);
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    8653
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者