BSOJ2117口胡

300iq牛逼

神仙题。。。第一眼就觉得不可做。。。

首先众所周知这玩意儿是个和 \(k\) 有关的凸函数。(\(l,r\) 固定)

然后。。。区间问题一般都比较无从下手,所以考虑使用数据结构维护。首选线段树和猫树。

如果是猫树的话感觉需要写动态凸包,常数过大直接放弃(

所以考虑线段树。设 \(f[0/1][0/1]\) 表示强制钦定 不选/选区间最左/右端的位置,可以通过这个更新。

然后在更新的时候直接闵可夫斯基和来合并凸包。

询问的时候如果直接合并凸包那么会获得 \(O(nq)\) 的优秀复杂度()

直接合并凸包的话需要在最终凸包上寻找下标。

考虑该如何去掉合并凸包。

闵可夫斯基和之后的凸包,下标也会做加法。也就是说我们可以寻找原凸包上面的下标。

下标可以对应斜率,于是我们二分斜率,然后在凸包上面二分对应的下标。一次需要在 \(O(\log n)\) 个凸包上面二分,复杂度为 \(O(q\log V\log^2n)\)配合巨大的常数明显无法通过

对于凸包上面二分,一个很经典的套路是将斜率排好序离线然后移动下标。

所以考虑一个“整体二分”。每次直接把下标平移到对应的斜率上即可。每个点只会被经过两次,所以复杂度是 \(O(n\log n+q\log V\log n)\) 的,能够通过。

要是不看题解我要多久才能想出来这一车东西呢。。。

posted @ 2022-04-25 10:57  Prean  阅读(32)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};