给予$n$个机器人,坐标$x$,观察范围$r$,智商$q$,对于一个机器人,如果有机器人在$[x-r,x+r]$,智商在$[q-k,q+k]$,之间则可以被观察到,问多少对机器人互相观察到。
CDQ分治
如果不需要互相看见,直接二维数点,即二维偏序即可。互相看见,只需要让半径小的去看半径大的,如果$r$小的能看见$r$大的,必然也能互相看到。这个时候第一层偏序以$r$排序
- 做法1:偏序完直接在CDQ分治里做二维偏序的准备工作(常数可能有点大)
- 做法2:提前做好二维偏序数点准备,第一层偏序以$x$,第二层以$y$偏序,统计有多少$r< R_{query}$。
- 做法3:观察到$k$很小,可以用单调队列,维护头尾。即可
- 做法4:若提前处理二维编序,第一层是$r$,则会在是否记录本身这个点上产生模糊不清!无法$AC$
- 注意,进行CDQ分治的时候注意排序函数需要兼顾所有维度
动态开点线段树
由于$k$小,我们可以在每个$q$,上建立线段树,最后$[-k+q,k+q]$,的线段树。$O(2kq\log n)$,在CF的神奇服务器上卡过
做法1
1 |
|
做法2
1 |
|
做法3
1 |
|