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