题目重点:OA 操作 `[1,x]` 在坐标建块,`[2,start,length]` 查询连续区间能否放置并拼接 0/1 结果。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版 block 占单个整数坐标,`[1,x]` 把 x 加入 occupied 集合,重复建同点为 no-op。
- `[2,start,length]` 查闭整数点集合 {start,...,start+length−1} 是否与 occupied 相交;length>0。
- 每个查询输出字符 1(可放)或 0(不可放),依输入顺序拼字符串;查询本身不改变占用。
- 题目没有给负坐标或无穷轴约束,训练版允许整数坐标。
解题路线
- 朴素实现用 set 存占用点;建块 O(1) 预期,查询遍历区间中每个整数点,一旦碰到占用就返回 0,否则 1。
- 若查询长度很大而建块较少,改用有序 set 找不小于 start 的首个占用点;若该点≤start+length−1 则拒绝,可 O(log B) 查询。
- 把所有查询结果按出现顺序 append 再 join,不要为 build 操作输出位。
- 核 `[1,2]` 后查询 start=3,length=2 看 3/4,可放;建 `[1,5]` 后查 start=3,length=3 看 3/4/5,不可放。
- 测边界恰落障碍、重复建、查询长 1、连续障碍、没有障碍和大 length 溢出。
手动走一遍
执行 `[1,2]`,`[1,5]` 后 occupied={2,5}。`[2,3,2]` 查 3、4,输出 1;`[2,3,3]` 查 3、4、5,输出 0。若把右端误写成 start+length,会把长 2 的查询错误地包含 5。
规模与取舍
B 个不同障碍、Q 次查询,朴素 set 构建 O(B) 预期空间,单次长度 L 的查询 O(L) 时间;有序树建 O(log B)、查询 O(log B),空间 O(B),还需输出 O(Q) 字符。
易错点与追问
容易失分的边界
- 把 length 当结束坐标,而不是区间长度。
- 把右端写成 start+length 导致 off-by-one。
- 查询成功后自动建块,题目没有此操作。
- 把 build 操作也输出 0/1,结果位数多了。
- 凭不完整的样例推断块有宽度或可移动。
继续深挖
- 支持删除块怎么改?
- 坐标为连续实数区间或块有长度时如何用区间树?
- 极大坐标值如何避免逐点扫描?
- 如果成功查询要立即占用该区间,如何保证并发原子?
