zoukankan      html  css  js  c++  java
  • Kick Start 2019 Round A Parcels

    题目大意

    $R imes C$ 的网格,格子间的距离取曼哈顿距离。有些格子是邮局。现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少。

    数据范围

    • $ 1 le R le 250 $
    • $ 1 le C le 250 $
    • 100 组测试数据
    • Time limit: 15 s

    分析

    显然可以二分答案。

    几何视角

    考虑平面上的整点(也称格点)。到一个格点的曼哈顿距离不大于 $k$ 的所有格点的轮廓是一个旋转了 45° 的正方形( For any point, the set of points within a manhattan distance of K form a square rotated by 45 degrees.),或者叫菱形。

    考虑所有离现有邮局的最短距离大于 $k$ 的格点,简称「未覆盖点」,每个未覆盖点都关联着一个上一段所说的菱形。如果所有菱形的交集不为空,那么只要从交集中取一点作为新邮局即可。

    这个方法的困难在于两个菱形的交集并不好计算。不过我们可以通过坐标变换,把原本的菱形变成正方形。正方形的交集是容易计算的。
    这个变换在算法竞赛界称为曼哈顿距离转切比雪夫距离。

    平面上两点 $ (x_1, y_1) $,$ (x_2, y_2) $ 的契比雪夫距离定义为 $max(|x_1 - x_2|, |y_1 - y_2|)$ 。

    对应的坐标变换是 $(x, y) longrightarrow (x + y, x - y)$ 。

    代数视角

    上述坐标变换的根源是曼哈顿距离的定义:

    两点 $ (x_1, y_1) $,$ (x_2, y_2) $ 的曼哈顿距离无非是下述四个值中最大者

    $ (x_1 - x_2) + (y_1 - y_2) $
    $ (x_1 - x_2) + (y_2 - y_1) $
    $ (x_2 - x_1) + (y_1 - y_2) $
    $ (x_2 - x_1) + (y_2 - y_1) $
    亦即
    $(x_1 + y_1) - (x_2 + y_2)$
    $(x_1 - y_1) - (x_2 - y_2) $
    $(x_2 - y_2) - (x_1 - y_1) $
    $(x_2 + y_2) - (x_1 + y_1)$
    四者的最大值。

    于是有
    egin{equation}
    |x_1 - y_1 | + |y_1 - y_2| = max(|(x_1 + y_1) - (x_2 + y_2)|, |(x_1 - y_1) - (x_2 - y_2)|) label{E:1}
    end{equation}

    利用 eqref{E:1} 式,我们可以从代数视角(而非几何视角)来解决这个问题。

    不妨把新邮局的坐标视作 $(x_2, y_2)$,把现有邮局尚不能覆盖的点的坐标视作 $(x_1, y_1)$ 。

    问题转化为
    是否存在点 $(x_2, y_2)$,满足当 $(x_1, y_1)$ 取遍未覆盖点,eqref{E:1} 的值始终不超过 $k$,换言之 eqref{E:1} 的最大值不超过 $k$ 。

    注意到,当 eqref{E:1} 取最大值时,$x_1 + y_1$,$x_1 - y_1$ 必取最值(即取最大值或最小值)。

    因此我们可以先遍历未覆盖点 $(x_1, y_1)$,算出 $x_1 + y_1$,$x_1 - y_1$ 的最值,再枚举所有可能的新邮局 $(x_2, y_2)$,求 eqref{E:1} 式的最大值,进行判断。

  • 相关阅读:
    CentOS 7.3离线安装 JDK
    七:程序是在何种环境下运行的
    六:亲自尝试压缩数据
    五:内存和磁盘的亲密关系
    四:熟练使用有棱有角的内存
    三:计算机进行小数运算时出错的原因
    二:数据是用二进制数表示的
    一:对程序员来说CPU是什么?
    单元测试的艺术-入门篇
    蔡康永的说话之道2-透过说话,懂得把别放在心上
  • 原文地址:https://www.cnblogs.com/Patt/p/11617460.html
Copyright © 2011-2022 走看看