CF1841F

原题

翻译

算是一道很经典的题了,所以决定写博客

设最后选出的四种生物个数分别是A,B,C,D,则最后的答案显然是(AB)2+(CD)2

我们不妨把一个生物群ai,bi,ci,di看成向量(aibi,cidi),则原题就变成了从n个向量中选若干个,使得这些向量的和的模长的平方最大

然后看到这题ABC139F

我们把这n个向量加入一个集合中,按照幅角排序,能够得到半个或一个凸包

最终的答案一定是凸包顶点上的一对点(x,y)之间的距离,因为如果答案是凸包的两个部分合起来,我们不如直接把这两个位置中间的所有向量都加入答案,这样得到的总是更优的

如图,两个绿色向量之和一定没红色向量优

image.png


方法1:

O(n2)的枚举肯定是不现实的,但我们发现从一个向量开始绕一圈后当遇到和他平行但方向相反的向量时,把他删掉答案肯定更优

如图,max(|v1|,|v2|)|v3|

image.png

我们可以用几何方法,因为上下两个向量平行,所以他们和v3形成的夹角一定有一个90,其一定比v3的模长要大

所以我们可以把这n个向量的反向量也加入凸包中,这样当存在一个向量和这个向量平行之前这个向量就会被它的反向量抵消掉

当然这样还存在一个问题,可能刚开始的时候把反向量加入了答案,但现实的答案时不能只使用反向量的

因此如果存在一个反向量vi的模角>vi,则我们先把前缀向量和+=vi,来保证反向量一定能起到删除作用

复杂度瓶颈在于排序,最终复杂度O(nlogn)


方法2:

我们发现这个区间肯定是有单调性的,所以我们可以使用双指针

用法和上面做法类似,如果碰到和他平行的就把左端点+1即可

同样也是O(nlogn),但方法1好写很多

posted @   FOX_konata  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示