• Hackerearth: Mathison and the Pokémon fights


    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$ 认为是 ①求$1dots r$之和,②求$1dots l$之和。

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

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

  • 相关阅读:
    javascript之数组去重方法
    经典问题之爬楼梯
    javascript之事件循环机制
    javascript之闭包
    javascript之动态改变this上下文
    块级元素的垂直居中对齐
    js数组对象
    javascript-冒泡法排序
    javascript-数组
    javascript-循环
  • 原文地址:https://www.cnblogs.com/TinyWong/p/7624609.html
Copyright © 2020-2023  润新知