TJOI2013-松鼠聚会
题目
关于曼哈顿坐标系和切比雪夫坐标系之间的相互转换。
前置技能
- 曼哈顿坐标系是通过切比雪夫坐标系旋转45∘后,再缩小到原来的一半得到的。
- 将一个点 (x,y) 的坐标变为 (x+y,x−y) 后,原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离
- 将一个点 (x,y) 的坐标变为 (x+y2,x−y2) 后,原坐标系中的切比雪夫距离等于新坐标系中的曼哈顿距离
分析
首先,原题中定义的距离是切比雪夫距离,看着非常奇怪。
我们先考虑如果是曼哈顿距离怎么做。
考虑一些点: (x1,y1),(x2,y2),…,(xn,yn)
只需求出: nminj=1n∑i=1|xi−xj|+|yi−yj|。
而: n∑i=1|xi−xj|+|yi−yj|=n∑i=1|xi−xj|+n∑i=1|yi−yj|
发现这两个维度互不影响,可以分别求出 x,y 轴的。
先对 x 从小到大排序,设 prei 前 i−1 个点到点 i 的 x 轴距离前缀和,即: prei=i−1∑j=1|xi−xj|
同理做后缀和: sufi=n∑j=i+1|xi−xj|
则: n∑i=1|xi−xj|=prei+sufi
y 轴同理。
所以只需要先将原切比雪夫坐标系转化为曼哈顿左边系就行了。
注意转化的时候先不要除 2,最后在除 2,可以防止产生小数。
代码
1 | #include <bits/stdc++.h> |