BZOJ-2716-天使玩偶angel-CDQ分治
2015-03-28 14:45
204 查看
描述
先给出n个点, 然后有m个操作, (1, x, y) 表示查询离(x, y)最近点的曼哈顿距离, (2, x, y) 表示插入点 (x, y).
分析
不会做... 又照着别人的代码打了一遍... CDQ分治总想不到思路
比较关键的几个地方是 : 1. 坐标的范围是小于1000000的所以可以用树状数组维护. 2. 距离点(x, y)最近的点和x的方位有四种, 左下左上右下右上, 然后只考虑一个方位, 另外的改变坐标即可. 3. 曼哈顿距离不是欧几里得距离, 是横纵坐标之差绝对值的和. dis({x, y}, {x', y'}) = |x-x'| + |y-y'|. 在只考虑(x', y')在(x, y)的左下方时, 可以去掉绝对值 : dis = x+y -
(x'+y'), 使x'+y'最大即可.
分治时始终保持横坐标递增, 分治时考虑左边对右边的影响, 上面说了要使dis = x+y - (x'+y')的x'+y'最大, 就按 x' 排序按 y' 用树状数组维护x'+y'的最大值. 在树状数组中查询小于y的最大x'+y'值.
代码
先给出n个点, 然后有m个操作, (1, x, y) 表示查询离(x, y)最近点的曼哈顿距离, (2, x, y) 表示插入点 (x, y).
分析
不会做... 又照着别人的代码打了一遍... CDQ分治总想不到思路
比较关键的几个地方是 : 1. 坐标的范围是小于1000000的所以可以用树状数组维护. 2. 距离点(x, y)最近的点和x的方位有四种, 左下左上右下右上, 然后只考虑一个方位, 另外的改变坐标即可. 3. 曼哈顿距离不是欧几里得距离, 是横纵坐标之差绝对值的和. dis({x, y}, {x', y'}) = |x-x'| + |y-y'|. 在只考虑(x', y')在(x, y)的左下方时, 可以去掉绝对值 : dis = x+y -
(x'+y'), 使x'+y'最大即可.
分治时始终保持横坐标递增, 分治时考虑左边对右边的影响, 上面说了要使dis = x+y - (x'+y')的x'+y'最大, 就按 x' 排序按 y' 用树状数组维护x'+y'的最大值. 在树状数组中查询小于y的最大x'+y'值.
代码
相关文章推荐
- bzoj 2716 天使玩偶 CDQ分治
- [BZOJ2716][天使玩偶angel][CDQ分治]
- 【BZOJ 2716/2648】 [Violet 3]天使玩偶 SJY摆棋子
- BZOJ.2716.[Violet3]天使玩偶(CDQ分治 坐标变换)
- [BZOJ2716][Violet 3]天使玩偶 && kdtree
- BZOJ 2716: [Violet 3]天使玩偶 [CDQ分治]
- 【bzoj 2716】[Violet 3]天使玩偶 (cdq分治+树状数组)
- [BZOJ2716][Violet 3]天使玩偶(cdq分治+bit)
- bzoj2716 [Violet 3]天使玩偶 k-d树
- 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)
- BZOJ2716:[Violet 3]天使玩偶——题解
- [bzoj] 2716 天使玩偶 || CDQ分治
- bzoj 2716 天使玩偶(CDQ分治,BIT)
- bzoj2716: [Violet 3]天使玩偶
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
- BZOJ 2648 SJY摆棋子 / 2716 Violet 3 天使玩偶 K-D树
- BZOJ 2716: [Violet 3]天使玩偶
- bzoj2716 [Violet 3]天使玩偶(同bzoj2648)
- BZOJ 2648: SJY摆棋子/BZOJ 2716: [Violet 3]天使玩偶 kdtree
- BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】