tiansuohaoer 在 Leetcode每日一题 —— 3505. 使 K 个子数组内元素相等的最少操作数 中发帖
思路
根据前天的思路,长为 k 的数组的最小操作数为前 \frac{k}{2} 大数的总和减去前 \frac{k}{2} 小数的总和。
现在的目标在于动态维护两个对应集合,支持增加与删除元素。对顶堆和 multiset 都可以完成维护,但前者的常数远小于后者。
对顶堆维护流程如下:
如果左侧或右侧溢出元素,那么将多出来的最大/最小元素移动到另一侧;
如果左侧最大元素大于右侧最小元素,那么将左右两侧元素互换;
删除元素时维护一个删除堆,将集合实际大小视为存储堆大小减去删除堆大小,如果存储堆与删除堆顶部元素相同那么同时弹出。
最后设 DP 状态为 dp_{x,y},表示处理到第 x 个位置,生成 y 个子数组的最小代价,dp_{n,k} 即为答案。时间复杂度 O(n \log n +nk )。
代码
class Solution {
public:
using ll...