前言

双堆懒删除

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

    Dancing Links X 舞蹈链. 实质为用循环十字链在图上将所有"1"的位置链起来 构造较为巧妙,且极易理解,本题为 DLX 模板(精确覆盖问题) DLX 算法的题目做法一 ...

  2. 邀请你参与字节跳动 UME 插件开发竞赛

    UME 是由字节跳动 Flutter Infra 团队出品和维护的 Flutter 应用内调试工具.通过在 Flutter 应用中加入 UME 工具,开发者们可以直接在应用内查看调试信息,而无需使用 ...

  3. 【赵渝强老师】MySQL的闪回

    MySQL DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至 ...

  4. Android Studio自带Profiler工具内存泄露分析步骤

    1.运行需要检测内存泄露的程序 这里以"com.example.opengltest"程序为例. 2.点击Profiler按钮 3.点击SESIONS "+"号 ...

  5. uniapp电子签名盖章实现详解

    项目开发中用到了电子签名.签好名的图片需要手动实现横竖屏旋转.并将绘制的签名图片放到pdf转换后的base64的图片上,可以手动拖动签名到合适的位置,最后合成签名和合同图片并导出.和以往一样,先发一下 ...

  6. 05 Transformer 中的前馈神经网络(FFN)的实现

    2:20:理论链接 博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链 ...

  7. 使用zipkin配置spring boot的链路器(httpclient、restTemplate)

    一.首先导入zipkin需要的依赖 <!--zipkin-brave start--> <dependency> <groupId>io.zipkin.brave& ...

  8. 云原生周刊:一条 Kubernetes 命令引发的悲剧

    开源项目 KSail 用于在 Docker 中配置支持 GitOps 的 K8s 集群的 CLI 工具. nginx-gateway-fabric NGINX Gateway Fabric 是一个开源 ...

  9. C++ mutable与常对象语义详解

    摘编自 <Effective C++> 条款三. "成员函数如果是const" 或者 "一个对象是const对象"到底意味什么?有两个流行概念:bi ...

  10. Git命令缩写

    g = 'git' ga = 'git add' gaa='git add --all' gapa='git add --patch' gb='git branch' gba='git branch ...