link
初学 wqs 二分,看了好久才懂题解qwq
首先这题显然可以费用流,进而可证答案具有凸性质,即如果设 \(f(x)\) 表示 \(a=x\) 时的答案,则 \(f(x)\) 是一个上凸的函数。由于凸函数相邻两点间的斜率单调不增,所以可以考虑 wqs 二分。
设当前二分到的斜率时 \(k\),则我们每选一个 A 球,就给答案减去 \(k\)。个人感性理解:wqs 二分的目的,就是找到一条在点 \((a,f(a))\) 处与凸包相切的直线的斜率,由于相切,所以在上凸函数中,斜率为 \(k\) 的直线在过点 \((a,f(a))\) 时截距 \(b=f(x)-kx\) 最大,由于 \(x\) 表示选了几个 A 球,因而每选一个 A 球就给答案减 \(k\)。
之后我们就需要求出最大的答案(截距),以及答案最大时需要选几个 A 球。考虑一个点 \(i\) 由不选 B 变成选 B 的贡献是 \(\max\{p_i+u_i-p_iu_i-k,u_i\}-\max\{p_i-k,0\}\),因而按这个值从大到小排序选 \(b\) 个即可,每个的贡献是 \(\max\{p_i+u_i-p_iu_i-k,u_i\}\)。在没有选 B 的点中,每个的贡献是 \(\max\{p_i-k,0\}\)。
如果需要选的 A 球数 \(>a\) 则说明斜率小了,反之则大了,这样二分下去即可(斜率单调不增)。最后用二分到的 \(k\) 再做一遍贪心,将其答案加上 \(ka\) 即是最终答案,时间复杂度 \(O(n\log^2n)\),进行神秘归并排序后能做到 \(O(n\log n)\)(?)。
code