「考试」小P的生成树
Posted lrefrain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「考试」小P的生成树相关的知识,希望对你有一定的参考价值。
考场上想到一半正解,没想到随机化,不然也许能够$A$掉。
题目所说的其实就是向量加法,求模长最长的向量生成树。
我们考虑对于两个向量,必然在平行边形对角线方向上,他们的投影和是最大的,长度就是对角线长度。
如果精度开到$1e-3$我们完全可以枚举最终的和向量的角度,因为只有在对角线,也就是正确的方向上,向量的模长才是最大的,所以也就是说即使枚举的角度不可构成,它得出的解也必然不是最优解。
但是精度开的很高,枚举复杂度过高了。(随机化角度就能A)
接着考虑对于某条向量有两种表达形式:
1.$(alpha,eta)$也就是坐标表示。
2.$(varphi,iota)$其中$iota=sqrt{alpha^2+eta^2}$,也就是极角模长表示。
向量在某个单位向量$( heta)$上的投影$len$就是:
$$len=cos(varphi- heta)iota$$
其中:
$$cos{varphi}=frac{x}{iota},sin{varphi}=frac{y}{iota}$$
$$egin{array}{rcl}\len &=& cos(varphi- heta)iota\ &=& (cos{varphi}cos{ heta}+sin{varphi}sin{ heta})iota\&=&(frac{x}{iota}cos{ heta}+frac{y}{iota}sin{ heta})iota\&=&cos{ heta}x+sin{ heta}yend{array}$$
然后可以求出两个向量投影相等时候的角度。
求出这个角度,发现它满足的条件是:
$$x_1cos{ heta}+y_1sin{ heta}=x_2cos{ heta}+y_2sin{ heta}$$
那么:
$$ an{ heta}=frac{y_2-y_1}{x_1-x_2}$$
$$ heta=arctan{frac{y_2-y_1}{x_1-x_2}}+(pi)$$
然后我们知道克鲁斯卡尔的过程,只跟边的相对大小有关系,那么其实只需要枚举$m^2$个角度即可,在这些角度中间不会发生生成树边决策改变,那么这些角度就足够了。
最终复杂度$O(m^2logm)$
以上是关于「考试」小P的生成树的主要内容,如果未能解决你的问题,请参考以下文章
[CSP-S模拟测试]:小P的生成树(数学+Kruskal)