zoukankan      html  css  js  c++  java
  • 「考试」小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)$

  • 相关阅读:
    xps转换为pdf工具
    公差与配合教案 2
    C#与C++抉择【z】
    MATLAB C#混合编程demo
    数据结构 第6章 图
    科技英语翻译480句 (九) 举例、异同、例外
    理论与数学应用互助交流QQ群(6314910) 简介【谢绝转载】
    数据结构 第3章 栈和队列
    精通Matlab与C/C++混合程序设计(第2版)
    科技英语翻译480句 (三) 原因、结果
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/11702731.html
Copyright © 2011-2022 走看看