扫描线 二维数点

扫描线模板

题目

记矩形数量为 n n n,坐标值域为 V V V

朴素的扫描线:从下往上依次扫,每次从左往右统计长度,时间复杂度 O ( V 2 ) O(V^2) O(V2)

  • 将矩形的上下边进行离散化,时间复杂度 O ( n V ) O(nV) O(nV)

  • 将矩形的横坐标离散化,分割成若干小线段,每次枚举小线段,时间复杂度 O ( n 2 ) O(n^2) O(n2)

  • 用线段树维护,节点区间 [ l , r ] [l,r] [l,r] 表示第 l l l 个点到第 r + 1 r+1 r+1 个点之间的小线段。维护覆盖次数以及覆盖长度,每次扫描到上下边时区间更新,时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

动图参考:https://oi-wiki.org/geometry/images/scanning.svg

具体实现

二维数点

1. [SHOI2007] 园丁的烦恼

矩形里数点可以用二维前缀和。因此维护 ( 0 , 0 ) (0,0) (0,0) ( a , b ) (a,b) (a,b) 点的数量,二维偏序问题,先按横坐标排序,然后套 BIT。注意 BIT 无法处理 0。

具体实现:将询问拆成四个点离线,点按横坐标排序,每次 BIT 加点、查询,时间复杂度 O ( ( n + m ) log ⁡ V ) O((n+m) \log V) O((n+m)logV) V V V 指坐标值域 。

具体实现

2. [CQOI2017] 老C的任务

在上题基础上加上离散化即可。

具体实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值