UOJ Logo pzc2004的博客

博客

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

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

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

评论

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

发表评论

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