前言

双堆懒删除

当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆 \(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的更多相关文章

  1. 在单链表和双链表中删除倒数第K个节点

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...

  2. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  3. 在ubuntu上搭建开发环境2---Win7、Ubuntu双系统正确删除Ubuntu

    这种删除ubuntu的方式就是针对本博客中搭建双系统的方式:http://www.cnblogs.com/xumenger/p/4459963.html 如果ubuntu不是以wubi方式安装的,那么 ...

  4. 【转】win7与ubuntu双系统,删除ubuntu后,启动错误error:no such partition grub rescue的修复--不错

    原文网址:http://blog.sina.com.cn/s/blog_541900d50101eu9r.html win7于ubuntu双系统,进入windows后直接格式化硬盘分区将ubuntu删 ...

  5. 在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  6. Win10 + Ubuntu双系统,删除Ubuntu系统

    之前在电脑上装了win10 + ubuntu的双系统,偶尔会出问题,所以还是选择将ubuntu系统删掉. 正所谓“请神容易送神难”,安装ubuntu的时候,过程还算顺利,但是在删除Ubuntu的过程中 ...

  7. win7安装Ubuntu变双系统以及删除Ubuntu分区操作

    Window7系统基础上安装Ubuntu使构成双系统,整个过程如下: 1. 一块空闲磁盘分区准备. “我的电脑”右键 > 管理 > 磁盘管理 > 压缩(从有空余分区压缩)/删除(删除 ...

  8. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  9. 算法总结之 在单链表和双链表中删除倒数第k个节点

    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...

  10. 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节

    [题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...

随机推荐

  1. CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件

    前言 今天大姚给大家分享一款由.NET开源.免费.强大的Visual Studio代码简化.整理.格式化实用插件:CodeMaid. 工具介绍 CodeMaid是一款由.NET开源.免费.强大的Vis ...

  2. [TK] BLO

    初步分析 此题描述让我们想到Tarjan求割点,因此我们从割点的角度来探讨一下这道题. 假如我们去掉的不是一个割点,那么它实际上不会对连通性造成影响,但是根据样例可以看出来,删去这个点导致了其余点与当 ...

  3. Foxmail 设置个人签名的方法

    事件起因: 在foxmail设置一个好看的个人签名 具体设置过程: 打开Foxmail - 右上角设置 -写邮件 签名的设置 字体格式:等线 10px 黑色 内容: 名字 | 名字英文 职位 个人邮箱 ...

  4. Linux工具:Winscp显示隐藏的文件

    事件起因: 需要用Winscp上传文件到服务器,然后发现文件被隐藏了 解决办法: Winscp软件的快捷键 : Ctrl + Alt + HWindscp软件的设置方法: 菜单栏 选项 -> 面 ...

  5. 2023年3月中国数据库排行榜:开源OTO揽获前三,传统达梦、GBase触机便发

    东风何时至,已绿湖上山. 春风送来了2023年3月的 墨天轮中国数据库流行度排行,本月共有260个数据库参与排名,本月榜单前十可以用一句话概括为:榜单前八较上月岿然不动,GBase 奋勇向前重返第九. ...

  6. 80篇国产数据库实操文档汇总(含TiDB、达梦、openGauss等)

    国产数据库发展得如火如荼,数据库的国产化替代也正在进行中.最近,有越来越多的朋友都加入了学习国产数据库的队伍中,本文便选取了墨天轮技术社区的国产数据库流行度排行榜上排名靠前的几个数据库,整理了相关的实 ...

  7. excel导出功能的实现流程说⼀下?

    导出的话,我们因为到处的数据量不⼤,所以直接采取的时候前端主导的⽅案,参考的现成⽅案实现的 导出 ⼤概得流程就是 1. 调⽤后端接⼝得到要导出的数据 2. 把数据简单处理⼀下转化成导出插件需要的格式 ...

  8. 云原生爱好者周刊:Lens 5.2 发布,支持 M1 芯片

    云原生一周动态要闻: Lens 5.2 发布 CNI 1.0.1 发布 K8ssandra 从 Helm 迁移到 Operator Amazon EKS Anywhere – 现在普遍可用于在本地创建 ...

  9. C#使用Kubernetes (k8s)

    在C#中使用Kubernetes (k8s) 通常通过官方的Kubernetes .NET客户端与Kubernetes API进行交互.以下是如何在C#中使用Kubernetes的简要指南. 1. 安 ...

  10. OKR 目标和关键成果

    OKR(Objectives and Key Results)是目标与关键成果管理法,是一套明确和跟踪目标及其完成情况的管理工具和方法.1.OKR首先是沟通工具:团队中的每个人都要写OKR,所有这些O ...