第 443 场周赛——使 K 个子数组内元素相等的最少操作数

news/2025/4/3 0:38:56/文章来源:https://www.cnblogs.com/PZnwbh/p/18804381

题目

使 K 个子数组内元素相等的最少操作数

题解

这题就是大杂烩,使用了延迟堆+滑动窗口来求出每个窗口内所有值变成它中位数的操作次数,最后再用划分型dp求出最小操作数。

我们先一个一个来分析,如何求取一块区间内的中位数,我们可以用对顶堆实现,可以参考题目295. 数据流的中位数。

这是不对元素进行删除时中位数的求法,那如果我们要用一个窗口不断往右走,那该如何求这个窗口内的中位数呢?
由于我们每次移动后前面的值出了窗口,我们如果每次遍历堆找出那个值时很麻烦的,这时候我们想到了延迟堆的做法,删除的时候,我们只记录「要删除一个值为 x 的数」,并不去「执行」删除操作。等到要出堆(或者查看堆顶)时才真正地执行删除操作。

那我们如何求的这个窗口内将所有值变成一样的操作数呢?
我们可以参考题目2602. 使数组元素全部相等的最少操作次数,题解用的是排序+前缀和+二分查找,我们可以用面积来求的需要的操作数。

那我们只需要在延迟堆的代码中再开一个变量维护和大小即可。

最后就是如何使用dp完成了。
将数组分成(恰好/至多)k 个连续子数组,计算与这些子数组有关的最优值。一般定义 f[i][j] 表示将长为 j 的前缀 a[:j] 分成 i 个连续子数组所得到的最优解。枚举最后一个子数组的左端点 L,从 f[i−1][L] 转移到 f[i][j],并考虑 a[L:j] 对最优解的影响。
本题f[i][j]表示前 j 个元素(即 nums[0..j-1])分成 i 个长度为 x 的子数组时,最小的操作数。只需要初始化f[i][i*x−1]=∞。并不需要初始化 j<i⋅x−1 的状态,因为我们不会访问这些状态。

参考代码

template<typename T, typename Compare = less<T>>
class LazyHeap {priority_queue<T, vector<T>, Compare> pq;unordered_map<T, int> remove_cnt;size_t sz = 0;long long s = 0;void apply_remove() {while(!pq.empty() && remove_cnt[pq.top()] > 0) {remove_cnt[pq.top()]--;pq.pop();}}public:size_t size(){return sz;}long long sum() {return s;}void remove(T x) {remove_cnt[x]++;sz--;s -= x;}T top() {apply_remove();return pq.top();}T pop() {apply_remove();T x = pq.top();pq.pop();sz--;s -= x;return x;}void push(T x) {if(remove_cnt[x] > 0) remove_cnt[x]--;else pq.push(x);sz++;s += x;}T push_pop(T x) {apply_remove();pq.push(x);s += x;x = pq.top();pq.pop();s -= x;return x;}
};class Solution {vector<long long> medianSlidingWindow(vector<int>& nums, int k) {int n = nums.size();vector<long long> ans(n - k + 1);LazyHeap<int> left;LazyHeap<int, greater<int>> right; for (int i = 0; i < n; i++) {int in = nums[i];if (left.size() == right.size()) {left.push(right.push_pop(in));} else {right.push(left.push_pop(in));}int l = i + 1 - k;if (l < 0) continue;long long v = left.top();long long s1 = v * left.size() - left.sum();long long s2 = right.sum() - v * right.size();ans[l] = s1 + s2;int out = nums[l];if (out <= left.top()) {left.remove(out);if (left.size() < right.size()) {left.push(right.pop()); }} else {right.remove(out);if (left.size() > right.size() + 1) {right.push(left.pop()); }}}return ans;} 
public:long long minOperations(vector<int>& nums, int x, int k) {int n = nums.size();vector<long long> dis = medianSlidingWindow(nums, x);vector f(k + 1, vector<long long>(n + 1));for(int i = 1;i <= k; i++) {f[i][i * x - 1] = LLONG_MAX;for(int j = i * x; j <= n - (k - i) * x; j++) {f[i][j] = min(f[i][j - 1], f[i - 1][j - x] + dis[j - x]);}}return f[k][n];}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909566.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QML】定时时间控制控件

代码:1 import QtQuick 2.152 import QtQuick.Controls 2.153 4 ApplicationWindow {5 width: 5006 height: 3007 visible: true8 title: "飞行时间设置"9 10 // 自定义时间选择组件11 Component {12 id: timeComponent13 …

Ollama本地部署qwen2.5

一、概述 Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。支持多种操作系统,包括 macOS、Windows、Linux 以及通过 Docker 容器运行。Ollama 提供对模型量化的支持,可以显著降低显存要求,使得在普通家用计算机上运行…

天下拍-艺术品拍卖经典案例分享

在当今快速发展的数字化时代,艺术品拍卖行业正经历着前所未有的变革。天下拍作为一款功能齐全的拍卖产品,凭借先进的技术平台和专业的服务团队,为艺术品拍卖提供了全新的解决方案。同步拍卖的模式和互联网运营工具的加持可以帮助您实现艺术品的高效变现和价值最大化。线上线…

[T.4] 团队项目:团队代码管理准备

项目 内容这个作业属于哪个课程 2025年春季软件工程(罗杰、任健)这个作业的要求在哪里 [T.4] 团队项目:团队代码管理准备我在这个课程的目标是 掌握代码管理与修复流程,完善团队协作机制这个作业在哪个具体方面帮助我实现目标 团队协作,软件开发代码管理基础团队代码仓库地…

asio使用async_connect,连接127.0.0.1,函数回调函数errorcode连接成功

编译运行rest_rpc库的客户端出现问题 asio使用async_connect,连接127.0.0.1,函数回调函数errorcode连接成功(没有启动服务器的情况下),需要等到调用发送函数,才会失败。调试发现是使用9000端口被本机另外的程序占用了-_- 环境:win10 netstat -ano | findstr "9000&…

算法备案没产品可以申请吗?

算法备案复审阶段涉及产品信息填报,所以一度让一些开发者有这样的错误认知:只有等产品要上线了,才能火急火燎地去申请算法备案。但这个观点其实是错误的,其实开发者也可以在没有具体产品的情况下发起算法备案申请。只要材料合法合规,也能取得备案号。下面是一些具体信息介…

工业通信协议“牵手密码”,Ethernet IP转Profinet网关的桥梁魔法

在当前工业自动化领域,实时以太网技术已经成为至关重要的通信标准之一。Profinet和EtherNetIP作为两种广泛采用的实时以太网协议,各自拥有其独特的性能优势和适用场景。本文旨在探讨稳联技术Profinet转EtherNetIP网关WL-PN-EIPM的功能,并评估其在节能实施与监测方面的应用价…

LeetCode刷题-动态规划-爬楼梯

LeetCode刷题-动态规划-爬楼梯 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。1 阶 + 1 阶 2 阶 示例 2:输入:n = 3 输出:3 解释:有…

【攻防世界】Hidden-Message

⭕、知识点 流量分析/端口号隐写/tshark/json文件处理 一、题目二、解法 1、端口号个位呈现有规律的01交替,可能隐藏信息。 2、为便于提取信息,使用kali的tshark对其进行转存 tshark -r input.pcap -T json > output.txt注意在使用tshark时应避免使用root账户 否则会出现如…

022 props组件交互

.vue 的文件,就是一个组件,每个.vue 文件就是每个页面html 的时候,每个页面都是一个 htmlvue2 和 vue3 的生命周期钩子是不同的components:常用的组件,公共的组件views:用来存放页面的新建项目,删除HelloWorld.vue components也删除views删除 这个index.js删除 这两页面…

客户端打开BI报表提示 Your current browser is not supported”

win7的打开会报这个问题, win11可以正常打开, 应该是环境差异导致。