A. 遮天蔽日
学习了计算几何相关的很多新技巧。
求过一点$P$,圆$O$的切线:通过两点距离、半径,用反三角函数可以解得一个角度,然后就可以算了。
求直线$PQ$,与圆$O$的交点:作点$O$关于$PQ$的垂线,通过半径和垂线长度,可以算得垂足与交点的距离,然后就可以算了。
求多边形的重心:任选一点$O$,选择顺时针(逆时针)上相邻的每个点对$(P,Q)$,对横纵坐标分别加权平均,加的权为面积。
公转:使重心旋转,保持每个点与重心的相对位置不变,整个多边形的朝向不变。
因为打的不是正解,所以伪了(在凸多边形下是正确的)。
正解的意思大概是,让太阳与每个端点作一条直线,分别交在地球上。
那么相邻的两个交点之间是否被覆盖的关系是相同的。
所以任选相邻的两个交点形成的弧上任意一点,判断该点到圆的线段上是否与其他任意一条线段相交即可。
B. 三元组
这个题和一道叫做最长双回文串的题很像。
容易发现那个对乘积的求和,可以拆成求和式*求和式。
处理出每个点为右端点的左侧贡献,每个点为左端点的右侧贡献,然后枚举作乘积就好了。
一个办法是打$manacher$,然后写恶心的等差数列差分。
另一个办法是直接使用回文自动机,简单粗暴维护$fail$树上每个点对应的回文串个数、回文串总长度即可。
C. 最有价值
可以发现,这个东西有点像最大权闭合子图。
然后是一些显然的建图。
与一道叫做寿司餐厅的题很像。
对于选每个点的代价,每种字符的第一个位置的代价为$b_i$,第一个位置之后的代价均为$a_i$。
用寿司餐厅中的套路,首先令每个位置的代价都为$a_i$,如果选了至少一个位置,那么强制付出再$b_i-a_i$即可。
魔改一下建图,用那些很套路的方法,可以将点数缩减到$O(n)$级别。
原文地址:https://www.cnblogs.com/skyh/p/12288887.html