首页 > 其他 > 详细

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

时间:2015-03-28 15:48:57      阅读:281      评论:0      收藏:0      [点我收藏+]

描述

先给出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-天使玩偶angel-CDQ分治

原文:http://blog.csdn.net/qq_21110267/article/details/44701469

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!