其它技巧

摘要:一些难以归类的技巧和算法。

点的距离

主要探讨切比雪夫距离和曼哈顿距离的关系。最基本的定义:有两个点记作 (x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2),两个点的曼哈顿距离是 x1x2+y1y2|x_1-x_2|+|y_1-y_2|,切比雪夫距离是 max(x1x2,y1y2)\max(|x_1-x_2|,|y_1-y_2|)。二者有密切联系,有图:

这张图说得非常精辟。蓝点对应的是与红点的曼哈顿距离恰好为 33 的点集,而把所有点旋转 4545^\circ 后,原来的曼哈顿集合就变成了切比雪夫集合。可以知道坐标转移关系是 (x,y)(x+y,xy)(x,y)\Rightarrow(x+y,x-y)。相似地,可以知道切比雪夫距离转曼哈顿距离的关系是 (x,y)(x+y2,xy2)(x,y)\Rightarrow (\frac{x+y}{2},\frac{x-y}{2})。前者的距离就相当于后者在转移后的点上的距离,这是一个很重要的结论。

P3964:切比雪夫距离转曼哈顿距离后枚举点即可。

P5098:曼哈顿距离转切比雪夫距离后贪心即可。

AT:由于洛谷题号混乱导致我不知道应该如何称呼一道 AT 的题目。考虑到一个点的曼哈顿集合是个斜着的菱形,十分不好处理,于是转化成切比雪夫距离后就比较清晰了。需要注意的是分组的时候要保证坐标是正数(不然位运算会出问题),统一加上一个 nn 即可。

P3439:转成曼哈顿距离后运用小学奥数芝士即可得出答案。要注意求出的点需要波动一下,以及要用 __int128,就比较魔怔。

P2906:一道比较综合的题目。题意是说将两个曼哈顿距离不超过给定值的点归入同一集合,问集合数量以及最大集合大小。显然用并查集维护。先把曼哈顿距离转成切比雪夫距离,然后限制就变成了横坐标之差和纵坐标之差均不超过给定值。有个结论,按照横坐标排序之后每个点只需要往左上第一个点和左下第一个点连边就可以保证正确性。证明上考虑假如按顺序有 A,B,CA,B,C 三个点,AACC 左上第一个,BBCC 左上更高的点,会发现 BB 一定会去发现 AA,这样一来三个点就还是联通的。所以用 set 或者平衡树来维护即可(我用的 set),要注意的是把 pair 压成整型时一定要考虑是否会炸掉,以及第一关键字是否可能是负数(涉及取模方式)。

P5193 上面那道题的双倍经验。

参考:link1