码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-28 15:49:30      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:cdq分治

描述

先给出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分治

标签:cdq分治

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!