题目:
有一条无限长的数轴,原点在 0 处,沿着 x 轴 正 方向无限延伸。
给你一个二维数组 queries ,它包含两种操作:
操作类型 1 :queries = [1, x] 。在距离原点 x 处建一个障碍物。数据保证当操作执行的时候,位置 x 处 没有 任何障碍物。
操作类型 2 :queries = [2, x, sz] 。判断在数轴范围 [0, x] 内是否可以放置一个长度为 sz 的物块,这个物块需要 完全 放置在范围 [0, x] 内。如果物块与任何障碍物有重合,那么这个物块 不能 被放置,但物块可以与障碍物刚好接触
请你返回一个 bool 数组results ,如果第 i 个操作类型 2 的操作你可以放置物块,那么 results 为 true ,否则为 false 。
思路:
显然使用线段树,甚至不需要区间更新,维护信息为区间最大值。
显然,把区间最大值的信息放在区间最右端最合适。如果这样的话,每个query都分成两个询问 : 0~L内最靠右的障碍物的x坐标 + x~L
因此,我们使用线段树维护区间最大值的同时,用一个集合保存障碍物信息,然后每次都查找。(注意哨兵元素)
代码:
[code]class Solution { vector t; void update(int x, int l, int r, int ui, int val) { if (l == r) { t[x] = val; return; } int mid = (l + r) >> 1; if (ui 1; if (qr |