感觉贪心的做法比较自然,推荐 这篇博客
非常经典牛逼的贪心思路:
考虑每次加入一个数,位置 i i i的贡献为 V i = k i × a i + b i V_i=k_i\times a_i+b_i Vi=ki×ai+bi,其中 k i k_i ki表示 i i i以前被选的位置的个数, b i b_i bi表示 i i i以后被选的数的和
发现每次都会加入当前贡献最大的数。想一想会发现非常对,可以用归纳+调整法证明。感觉就是拟阵啊?
这样,我们考虑分块,发现对于整块的询问本质上就是维护凸包(类似于斜率优化),这样就做完了
事实上我们不需要在凸包上二分,注意到询问的 k k k是递增的,因此不断弹出队头元素即可
复杂度 O ( n n ) O(n\sqrt{n}) O(nn)。
remark \text{remark} remark 别把凸优化学魔怔了。。。不是啥题都要用 D P DP DP。。。