3 条题解
-
2
题意:给定 和平面上的 个点,数有多少个矩形(左下 、右上 ,要求 、)里至少含一个给定点,答案对 取模。
最直白的做法是把所有矩形都枚举一遍。先按输入把点打到一张二维前缀和表上,这样判断「某个矩形里有没有点」就是 的;然后四重循环枚举 与 ,有就累加。
代价是 ,可以过测试点 ,20 分。
直接数「至少包含一个给定点的矩形」不好数,改成按 x 方向分列枚举。
把 个点的 坐标去重排序,得到若干列 (再加两个哨兵 、)。矩形的左边界 落在哪两条相邻列之间、右边界 落在哪两条之间,一共只有 种「列区间」可以枚举。
固定一段列区间(矩形至少要横跨第 到第 列里的点)之后再看 y 方向:
- 左边界 只能在 里取,共 种;
- 右边界 只能在 里取,共 种;
- 中间这些列的点,按 从小到大依次插入有序集合。插入一个点 时设它在已插入集合里的前驱、后继分别是 ,那么以这个点为最低点、且 y 区间内至少含一个点的 对数正好是 。
把所有点这样累加起来,每一对合法的 都会被「它包含的最低那个点」统计恰好一次,不重不漏。于是这段列区间的贡献就是
$$(\text{y 方向的合法区间数})\times(v_i-v_{i-1})\times(v_{j+1}-v_j)$$对所有列区间求和即可。
列数不超过 ,每段列区间的 y 方向扫描用有序集合做,总复杂度 。
信息
- ID
- 2782
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 61
- 已通过
- 11
- 上传者