UOJ Logo pzc2004的博客

博客

#47. 【清华集训2014】文学 爆标做法

2022-02-18 16:01:04 By pzc2004

考虑将直线分为 bi0bi<0 的两类,则第一类直线可以覆盖它下面的点,第二类直线可以覆盖它上面的点。最优解下选取的这两类直线一定各自构成了两个凸壳,而当我们将所有点按照 xi 从小到大排序后,可以发现对于所有 xix 的点,所有能被当前凸壳覆盖的点一定能被凸壳的最后一条直线覆盖,所以我们只需记录两个凸壳各自的最后一条直线。令 fi,j,k 表示第 i 个及之前的点都已被覆盖,两个凸壳各自的最后一条直线分别是 j,k 时的最小花费。因为对于每个点我们都最多加入一条直线,我们直接暴力枚举这条直线并去掉不覆盖当前这个点的方案即可,由于是取 min,我们甚至不需要判断跟凸壳有关的任何信息,复杂度 O(NP3),实测跑得飞快。
以上做法还可以进一步优化,空间上我们可以去掉 f 的第一维,时间上我们可以直接用局部最小值来转移,最终复杂度 O(NP2),可能还有进一步优化的空间,所以实际上这题可以不用任何计算几何

评论

if(d==1){ cout<<“黄火枪手被你打死了!”;

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。