如果转换为二维数点,那么其实这个长方形的左下角就是 (l, 0),右上角就是 r, x(这里 x, y 坐标反过来也可以)。
所以我们就可以建点 (i, a_i),然后做二维数点。
这个似乎很像二维偏序?那么我们就可以按 x 从小到大扫(也就是消掉 x 的限制),扫到一个询问时,所有符合 \le x 的点都已经加进去了,DS 里正好就是满足条件的点,答案就是 DS 的 query(r) - query(l - 1)。这样就把二维问题降成了一维,然后加点就是在 i 位置 +1,表示这个位置有一个满足 \le x 的点。查询 [l, r] 就是看这个区间里有多少个这样的点。
时空复杂度
时间复杂度:O((n + m) \log n)。
空间复杂度:O(n + m)。
AT_abc327_f Apples
题意
给定 n 个苹果,第 i 个在时间 t_i 掉在坐标 x_i。再给定一个篮子,长度是 w,能用 d 单位时间。你可以选一个开始时间 s 和一个左端点 l,篮子会盖住 [l, l + w) 这块地方在时间 [s, s + d) 掉落的苹果。问最多能拿几个苹果。
思路
篮子有两个窗口:时间上 [s, s + d),空间上 [l, l + w)。一个苹果 (t_i, x_i) 要被接住,必须同时满足:
s \le t_i < s + d, l \le x_i < l + w
第二个条件可以转换为左端点 l 的范围:
x_i - w + 1 \le l \le x_i
也就是说每个苹果会对一段连续的左端点区间产生贡献。
那么我们有了这个公式就可以先按照 x 坐标排序(也就是时间维),然后从小到大扫。篮子长度固定,那么苹果就会在当前 x = t_i 的时间加入,在 x = t_i + d 时删除,那么就用 DS 维护。