Mathison and the Pokémon fights code

这是一道比较有意思,出的也非常好的题目。

给定$n$个平面上的点$(x_i, y_i)$,(允许离线地)维护$Q$个操作:
1.  0 $p$ $x$ $y$ 更改第$p$个点为$(x, y)$。
2.  1 $l$ $r$ $x$ $y$ 求第l个到第r个点与$(x, y)$之间的Chebyshev距离之和,即
$$ \sum_{i=l}^r \max\{|x_i-x|, |y_i-y|\}. $$

分析:

Chebyshev距离可以通过变换

$$(x, y) \mapsto (x+y, x-y)$$

转化为Manhattan距离,即 $(x_1, y_1)$与$(x_2, y_2)$的Chebyshev距离 等于 $(x_1+y_1, x_1-y_1)$与$(x_2+y_2, x_2-y_2)$的Manhattan距离的一半(因为变换的时候坐标放大了一倍)。

经过这个变换之后,x坐标和y坐标就相互独立了,因为两个点$(x_1, y_1)$与$(x_2, y_2)$的Manhattan距离为$|x_1-x_2|+|y_1-y_2|$。

于是转换成了一个更简单的题目:

给定一个长度为$n$的序列$a_i$,(允许离线地)维护$Q$个操作:
1. 0 $p$ $x$ 更改$a_p$为$x$。
2. 1 $l$ $r$ $x$ 求$\sum_{i=l}^r |x-x_i|$。

这题有很多种做法,官方题解的复杂度是$O(n \sqrt n \log n)$,不尽如人意。

我在比赛时成为了全场最快的解法,总时间18.65s,最大点1.16s,大概比速度第二快的(总时间大约30+s)快一倍。

解法是离线的cdq分治+树状数组。

把每个操作分成两个操作:
1. 0 $p$ $x$ 认为是 ①在平面上删除$(p, x_p)$,②在平面上插入$(p, x)$。
2. 1 $l$ $r$ $x$ 认为是 ①求$1\dots r$之和,②求$1\dots l$之和。

这样可以通过cdq维护二维偏序来解决这个问题。

时间复杂度$O((n+Q) \log^2(n+Q))$。

最新文章

  1. Go语言实战 - 创业进行时之创业伊始
  2. Android广播
  3. oracle空表导出的问题
  4. MVC的URL路由规则
  5. 集合类(Objective-C & Swift)
  6. JLOI 提示问题
  7. dojo 十一 jsonp
  8. Essential C++ 学习笔记01--基本语法
  9. javascript学习代码--点击按钮显示内容
  10. ASP.net:截取固定长度字符串显示在页面,多余部分显示为省略号
  11. xsqlbuilder使用说明
  12. .NET平台机器学习
  13. Py4j-RPC
  14. poj 3620
  15. ASP.NET Core中使用表达式树创建URL
  16. slf4j+logback搭建超实用的日志管理模块
  17. curl提示不支持https协议解决方法
  18. java虚拟机规范(se8)——java虚拟机结构(三)
  19. c++ 参赛设置
  20. virtualbox+vagrant学习-5-Boxes-1-简介

热门文章

  1. 如何快速的知道Maven插件的命令行输入参数
  2. sql中Cast()函数的用法
  3. 基于centos 创建一个stress镜像
  4. python的分布式队列神器 Celery
  5. 公司hadoop客户端试用
  6. 改动Xmodem/Zmodem上传下载路径
  7. [cocos2d-x]怎样降低cocos2d-x游戏的耗电量?
  8. react 中的无状态函数式组件
  9. background-color
  10. 使用 C# 开发智能手机软件:推箱子(四)