题目
【题目大意】
给定若干个靶子(xl, xr, yl, yr, z),z为该靶子离射击位置的距离,所有靶子都可以看成是二维平面上平行于坐标轴的矩形。然后按顺序给定若干个子弹的射击位置(x, y),子弹射到一个靶子就会将靶子打碎,并掉落到地上。问每个子弹射到的靶子是谁。保证靶子的z值不相同。
【算法】
把子弹变成包含三个元素的点(x, y, id(就是说这是第几个子弹))。然后把靶子按z排序,从前往后扫,对于每个靶子,去找自己这个区域里面权值(id)最小的子弹,匹配上以后把这个点删掉。重复上面的操作,最后就能得到结果。
所以这里需要一个找矩形内权值最小的点的数据结构,并能支持删除操作。显然,KDTree是一个比较好的选择,查找操作是$$O(\sqrt{n})$$的,删除操作是$$O(\log n)$$的。
【时间复杂度】$$O(m \sqrt{n} )$$
【空间复杂度】$$O(n)$$
【代码】
WA了好多次,改得略丑。但是速度还是很快的。
#include
#include
#include
#include
#include
#include
#include