1689D Lena and Matrix (曼哈顿距离转切比雪夫距离/随机化/线段树)
记一道有趣的题:P
题意
这道题很有意思。
给定地图上若干个黑色的点,求这样一个点的坐标,满足其到图中任何一个黑色点的最大曼哈顿距离最小。
\(max(|a-x_i|+|b-y_i|),i=1,2..k\)
方法一
曼哈顿距离和且比雪夫距离可以互相转化,曼哈顿转切比雪夫如下:
\((x,y) \to (x+y,x-y)\)
转化后原坐标的曼哈顿距离等价为转化后的切比雪夫距离。也就是:
\(max( max((X-xi),(Y-yi)))\)
证明详见:https://oi-wiki.org/geometry/distance/
这样就把两个维度拆开了,只要对于\(x+y,x-y\)分别求最大/最小值,再枚举矩阵上的点打擂台即可。
方法二
随机化的做法是随机500个格子,找出距离它们最远的黑色格子,把这些黑色格子作为“最远点”。再枚举矩阵上所有点求答案。
原理是500个格子找出的黑色格子,极大概率包含方法一中\(x+y,x-y\)的最大/最小值。
方法三
考虑列数固定的时候,有用的只有最上面的格子和最下面的格子,格子的数量级压缩到了\(O(m)\)。
按行枚举矩阵上每一个格子,从\((i,j) \to (i,j+1)\)时,\([1,j]\)列的格子贡献\(+1\),\([j+1,m]\)列的格子贡献-1,线段树区间操作即可。这部分的复杂度是\(O(nmlogm)\)
当一行枚举完,挪到下一行开始枚举时,初始化的复杂度是\(O(m)\)的,这部分总的复杂度是\(O(nm)\),可以接受