1 条题解
-
0
旅馆房间管理(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
- 上传者