CSP-S模拟73

    T1模拟挂了,T2A了,T3不会~总分100

  

 

 

 A.小P的2048

    简单的模拟,注意细节,考试时打挂了,因为大样例非常特殊,它只有0,1,2操作,而我正好right操作打飞了,100->0

  B.小P的单调数列

    离散化,倒序枚举,三个树状数组维护最大的单调升序列的和,最大降序列的和,最大一部分上升序列加下降序列的和,转移挺简单的

  C.小P的生成树

    最大生成树中的所有向量的和的模长是一个合向量的模长,即所有向量在这个合向量的方向向量上的映射(分向量的模长)之和

    我们可以$360^{Huge。}$无死角枚举所有方向向量,但是这样枚举会有很多(虽然实测0.01度的枚举会非常快)

    kurskal有一个性质:生成树的形态只与各边边权的相对大小有关,而与具体权值无关

    而对于两个向量,存在一个方向向量使得它两个在这个方向上的投影值相等

    那么这个方向向量就将整个$[0,2π]$区间分成了两个部分,一部分向量1投影大,一部分向量2投影大

    枚举每两个向量,求出划分的边界,这些方向向量将$[0,2π]$区间划分成若干个小区间,在每一个小区间内这m个向量(边)的相对大小确定,所以直接跑最大生成树即可

    具体做法,枚举两个向量$(a,b),(x,y)$,在某一方向向量 $(cosθ,sinθ)$投影相等,则 有式子 $ a*cosθ+b*sinθ =x*cosθ+y*sinθ $,移项化简得 $tanθ=frac{a-x}{y-b} $

    可得两个值 $ θ_1=arctan(frac{a-x}{y-b}),θ_2=θ_1+π$,将$θ$存进数组

    求出每两个边(向量)的边界的方向向量的$θ$,再将所有角度sort一下,枚举 i和i+1的角度之间的任意一个角度的方向向量都可以淂出这个区间内$m$个向量的相对大小,最好是枚举两个的中间的角度$(θ_1+θ_2)/2$的方向向量$(cos θ_3,sinθ_3)$,那么向量$(a,b)$在这个方向的映射就是$len= (a*cosθ_3+b*sinθ_3)$

    跑最大生成树,记录$sum a$和$sum b$,求出ans,因为映射到的方向向量只是反映了这个区间内m个向量的相对大小,也就是可以确定m个向量在这个区间内跑生成树选择那些边,但选择的边在这个区间的和不一定就和该方向向量一致,所以真正的边权和还需要统计 $sum a$和 $sum b$另求 

 

原文地址:https://www.cnblogs.com/heoitys/p/11674371.html