前言

双堆懒删除

当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆 \(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. 2024 年 C# 高效开发:精选实用类库

    前言 在平时开发中,好的类库能帮助我们快速实现功能,C#有很多封装好的类库. 本文将介绍一些2024年特别受欢迎的C#类库,并分析各自的优点让我们编程写代码变的更轻松.更快捷. 快来看一看有没有大家常 ...

  2. 在 Node.js 中使用 ES6 模块 import 和 export

    1.Node版本 >= 13 2.使用 ES6 模块 a.js export const A = 'A'; index.js import { A } from './a.js'; consol ...

  3. ChatGPT “眼”中的开源数据库

    开源作为数据库发展的未来趋势之一,被冠以"数据库弯道超车的法宝"的称号.中国开源数据库产品正处于蓬勃发展的趋势,根据 墨天轮中国数据库流行度 ,截止2023年2月底已有46款开源数 ...

  4. 如何使用echarts

    官网:https://echarts.apache.org/handbook/zh/get-started/ a 下载js文件并引入 b 初始化实例对象 echarts.init(获取盒子对象)  关 ...

  5. python中字典的运算

    问题: 如何查找在两个字典中相同的键.值元素? dict1 = {'a': 1, 'b': 2, 'c': 3} dict2 = {'a': 10, 'y': 11,'b': 2} dict1.key ...

  6. 自定义log4j2的PatternLayout参数

    1.添加类 package com.yuanian.micro.config; import org.apache.logging.log4j.core.LogEvent; import org.ap ...

  7. 用sdkman管理多个jdk切换

    前言 最近项目前后端进行升级,需要在jdk8和jdk17两个版本切换.最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的.于是尝试其它解决方案,最终确实使用sdkman工具. sdk ...

  8. 自学PHP笔记(二)PHP数据类型

    PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 boolean 布尔值 integer 整型 float 浮点型 array 数组 object 对象 resource 资源 N ...

  9. Machine Learning Week_6 Adjust the Model.

    目录 0 Advice for Applying Machine Learning 1 Evaluating a Learning Algorithm 1.1 Deciding What to Try ...

  10. IDEA 2024.2.2 最新安装教程(附激活-2099年~)

    访问 IDEA 官网 下载 IDEA 2024.2.2 版本的安装包. 下载补丁https://pan.quark.cn/s/fcc23ab8cadf 检查 进入 IDEA 中后,点击菜单 Help ...