考场上想到一半正解,没想到随机化,不然也许能够$A$掉。
题目所说的其实就是向量加法,求模长最长的向量生成树。
我们考虑对于两个向量,必然在平行边形对角线方向上,他们的投影和是最大的,长度就是对角线长度。
如果精度开到$1e-3$我们完全可以枚举最终的和向量的角度,因为只有在对角线,也就是正确的方向上,向量的模长才是最大的,所以也就是说即使枚举的角度不可构成,它得出的解也必然不是最优解。
但是精度开的很高,枚举复杂度过高了。(随机化角度就能A)
接着考虑对于某条向量有两种表达形式:
1.$(\alpha,\beta)$也就是坐标表示。
2.$(\varphi,\iota)$其中$\iota=\sqrt{\alpha^2+\beta^2}$,也就是极角模长表示。
向量在某个单位向量$(\theta)$上的投影$len$就是:
$$len=cos(\varphi-\theta)\iota$$
其中:
$$\cos{\varphi}=\frac{x}{\iota},\sin{\varphi}=\frac{y}{\iota}$$
$$\begin{array}{rcl}\\len &=& cos(\varphi-\theta)\iota\\ &=& (\cos{\varphi}\cos{\theta}+\sin{\varphi}\sin{\theta})\iota\\&=&(\frac{x}{\iota}\cos{\theta}+\frac{y}{\iota}\sin{\theta})\iota\\&=&\cos{\theta}x+\sin{\theta}y\end{array}$$
然后可以求出两个向量投影相等时候的角度。
求出这个角度,发现它满足的条件是:
$$x_1\cos{\theta}+y_1\sin{\theta}=x_2\cos{\theta}+y_2\sin{\theta}$$
那么:
$$\tan{\theta}=\frac{y_2-y_1}{x_1-x_2}$$
$$\theta=\arctan{\frac{y_2-y_1}{x_1-x_2}}+(\pi)$$
然后我们知道克鲁斯卡尔的过程,只跟边的相对大小有关系,那么其实只需要枚举$m^2$个角度即可,在这些角度中间不会发生生成树边决策改变,那么这些角度就足够了。
最终复杂度$O(m^2logm)$
原文地址:https://www.cnblogs.com/Lrefrain/p/11702731.html