【双堆懒删除】codeforces 1294 D. MEX maximizing
前言
双堆懒删除
当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆 \(ex\),新的堆为懒删除堆 \(de\)。那么当需要从保存堆中删除任意一个元素时,可以先将元素放入懒删除堆 \(de\) 中。当需要从保存堆 \(ex\) 中取出元素时,若保存堆的堆顶与删除堆的堆顶相同,则共同弹出堆顶元素,循环此过程直至当堆顶不再相同时,保存堆堆顶元素就是当前最大值(或最小值)。
题目
https://codeforces.com/problemset/problem/1294/D
题意
第一行,输入两个正整数 \(n, m(1 \leq n, m \leq 4*10^5)\),接下来 \(n\) 行每行输入一个非负整数 \(w_i(0 \leq w_i \leq 10^9)\)。
在每次询问时,你都可以将现有的任意个数进行 \(w_i = w_i \pm m\),且对每个数都可以执行任意次操作(包括 \(0\) 次)。当操作完成后,输出最大的 MEX(\(w\))。
题解
首先思考: \(w_i\) 进行任意次 \(w_i = w_i \pm m\) 操作后,\(w_i\) 能转变的值有哪些?不能转变的值有哪些?
例如:\(m = 3, w_i = 5\),进行任意次转变后,\(w_i\) 可以转变的值有 \(change = [2, 5, 8, ...]\),不能转变的有 \(1, 3, 4, 6, 7, ...\)。
观察可以发现:可以转变的值,都是可以通过 \(min(change) + 3x(0 \leq x)\) 转变的,而 \(min(change) = w_i % m\)。
因此,可以根据对 \(m\) 取模的结果分为 \(m\) 份,统计每份的数量。\(MEX\) 为数量最少的数中数值最小的数 + 数量 \(\times\) 数量最少的数中最小的数对 \(m\) 取模的结果。
若用一个数组维护每份的数量,每一次查询 \(MEX\) 的时间复杂度都是 \(O(n)\),总体时间复杂度就会来到 \(O(n^2)\),显然不可接受。
可以用双堆懒删除对维护每份的数量进行维护,时间复杂度为 \(O(m + nlogm)\)。
参考代码
#define PII pair<int, int>
constexpr int N = 4e5 + 7;
int n, m, w;
int a[N];
void solve() {
cin >> n >> m;
priority_queue<PII, vector<PII>, greater<PII>> ex, de;
for (int i = 0; i < m; ++ i) ex.emplace(make_pair(0, i));
while (n --) {
cin >> w;
de.emplace(make_pair(a[w % m] ++, w % m));
ex.emplace(make_pair(a[w % m], w % m));
while (!de.empty() && !ex.empty() && de.top() == ex.top()) {
de.pop();
ex.pop();
}
cout << ex.top().second + ex.top().first * m << '\n';
}
}
【双堆懒删除】codeforces 1294 D. MEX maximizing的更多相关文章
- 在单链表和双链表中删除倒数第K个节点
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 在ubuntu上搭建开发环境2---Win7、Ubuntu双系统正确删除Ubuntu
这种删除ubuntu的方式就是针对本博客中搭建双系统的方式:http://www.cnblogs.com/xumenger/p/4459963.html 如果ubuntu不是以wubi方式安装的,那么 ...
- 【转】win7与ubuntu双系统,删除ubuntu后,启动错误error:no such partition grub rescue的修复--不错
原文网址:http://blog.sina.com.cn/s/blog_541900d50101eu9r.html win7于ubuntu双系统,进入windows后直接格式化硬盘分区将ubuntu删 ...
- 在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- Win10 + Ubuntu双系统,删除Ubuntu系统
之前在电脑上装了win10 + ubuntu的双系统,偶尔会出问题,所以还是选择将ubuntu系统删掉. 正所谓“请神容易送神难”,安装ubuntu的时候,过程还算顺利,但是在删除Ubuntu的过程中 ...
- win7安装Ubuntu变双系统以及删除Ubuntu分区操作
Window7系统基础上安装Ubuntu使构成双系统,整个过程如下: 1. 一块空闲磁盘分区准备. “我的电脑”右键 > 管理 > 磁盘管理 > 压缩(从有空余分区压缩)/删除(删除 ...
- [算法]在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- 算法总结之 在单链表和双链表中删除倒数第k个节点
分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
随机推荐
- 初步认识uboot
1. uboot下载地址 ftp://ftp.denx.de/pub/u-boot/
- 【赵渝强老师】Oracle数据库的内存结构
首先,我们通过一张图片来了解一下Oracle数据库的内存结构,如下: 每个数据库实例有两个关联的内存结构-系统全局区(SGA),程序全局区(PGA). 系统全局(SGA):一组共享的内存结构(称为SG ...
- PHP面试,ES
什么是Elasticsearch? Elasticsearch是一个开源的分布式搜索和分析引擎,用于存储.搜索和分析大量数据.它基于Lucene搜索引擎构建,可以快速地执行全文搜索.结构化查询.分析和 ...
- 来参与Oracle VS openGauss 在线研讨,与盖国强老师、李国良教授面对面!
11月11日下午14点,墨天轮社区邀请到两位数据库领域的巅峰人物:Oracle ACED 盖国强老师,和来自清华大学计算机与技术系的李国良教授,他们将进行一场"巅峰对话". 墨天轮 ...
- js正则表达式 禁止输入汉字
const validateChinese = (rule, value, callback) => { var regex = /[\u4e00-\u9fa5]/; console.log(' ...
- C # 的 IsNullOrEmpty
作用:判断字符串是否是 null 或者 "" 如果是 null or "" 就返回 true IsNullOrEmpty是判断字符串的Null值和"& ...
- vant2 List 组件 下拉加载 onLoad
ps:loading finished onLoad 两个变量一个函数 : async onLoad() { console.log("onload"); // 异步更新数据 // ...
- Android复习(三)清单文件中的元素——> activity
转自: https://developer.android.google.cn/guide/topics/manifest/activity-element <activity> 语法: ...
- JOI Open 2018
T1 Bubble Sort 2 题意:给定一个长度为 \(n\) 的序列 \(a\),进行 \(q\) 次修改,第 \(i\) 次将第 \(x_i\) 个元素的值修改为 \(y_i\). 对于每次操 ...
- 蜘点云原生之 KubeSphere 落地实践过程
作者:池晓东,蜘点商业网络服务有限公司技术总监,从事软件开发设计 10 多年,喜欢研究各类新技术,分享技术. 来源:本文由 11 月 25 日广州站 meetup 中讲师池晓东整理,整理于该活动中池老 ...