BZOJ-2716-天使玩偶angel-CDQ分治

来源:互联网 发布:淘宝怎么举报别人盗图 编辑:程序博客网 时间:2024/05/01 08:14

描述

先给出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'值.

代码


2 0
原创粉丝点击