我们充分发扬人类智慧:
将所有点全部绕原点旋转同一个角度,然后按 xxx 坐标排序。
根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太远。
所以我们只取每个点向后的 555 个点来计算答案。
这样速度快得飞起,在 n=1000000n=1000000n=1000000 时都可以在 1s 内卡过。
-- By 某 Luogu 大佬--
洛谷原题:P1257 平面上的最接近点对
我们飞快地写出了:(AC,38ms)
一看最优解榜,一共就 888888 页,这代码排第 101010 页。
这当然是不行的。考虑优(xuan)化(xue)。
我 (用名字颜色) 注意到,这数据实在是 太水,太水,太水了。实测在不旋转的情况下,只需要按 xxx 坐标排序后,每个点往后判断 333 个点(ACGO的数据甚至只需要判 222 个)就可以 AC。
然后,把我的快读进化成光读,用 register 系列卡亿卡常,再压亿压行,就一举拿下了最短最优解。
压行代码:
未压行的:
附最优解帅照。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于那个旋转也许大家不太理解。其实用到了两条公式:
* x′=xcosθ−ysinθx'=x\cos\theta-y\sin\thetax′=xcosθ−ysinθ
* y′=xsinθ+ycosθy'=x\sin\theta+y\cos\thetay′=xsinθ+ycosθ
其中 (x,y)(x,y)(x,y) 是原来的坐标,(x′,y′)(x',y')(x′,y′) 是旋转后的坐标,θ\thetaθ 是旋转角。
这里直接使用 time mod 400time \bmod 400timemod400 来做随机旋转角了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
附赠:
平面最近点对(加强版)(ACGO)
P1429 平面最近点对(加强版)(洛谷)
P7883 平面最近点对(加强加强版)(洛谷)
这三题和本题除了数据和数据范围就只有一些细节不同了。这三题的正解是 O(nlogn)O(n\log n)O(nlogn) 或 O(nlog2n)O(n\log^2 n)O(nlog2n) 的分治,但是这个随机旋转+排序如果能打好,也能 AC。建议在交加强加强版之前先去洗个脸(滑稽)。
加油哦(