题解:P11266 【模板】完全体堆

news/2024/11/8 20:05:53/文章来源:https://www.cnblogs.com/wryyy-233/p/18535842

也算是对 pb_ds 库中的优先队列各种操作的科普?

一些碎碎念

提醒:你可以不看这部分,这部分算是作者探索未知功能的过程

平常写优先队列的时候一般用不到对值进行修改或者删除的操作,所以我在看这到题的时候在想怎么才能实现题目中的操作,因为我不知道有什么成员函数可以直接获取具体哪个值的迭代器,但是 pb_ds 中却恰好又有这些我所需要的函数,而且都需要迭代器。

首先我是知道 pb_ds 中的所有数据结构支持迭代器访问的,不像标准库的部分数据结构是不支持迭代器的,所以自然而然就想到了 lower_bound ,想着能不能使用,结果却真过编了,但是当然是没用的,这样只会返回错误的迭代器,后面查阅了资料才想起来 pb_ds 的迭代器比较强大,点类型迭代器只要没被删除都保持有效,所以可以直接保存 push 时返回的迭代器,然后在具体操作的时候利用上就是了,我开始还不知道为什么要对某个位置进行操作,现在知道了。

具体实现

推荐阅读资料:

  1. OI-Wiki 上对 pb_ds 优先队列的介绍。
  2. 该篇博文对 pb_ds 的详细介绍。

首先 push 操作是会返回点类型迭代器的,所以可以在每个元素一开始被插入的时候记录下来,然后在需要的时候直接调用即可。

注意到在一开始就要开出数组来,所以要知道该迭代器类型名,类型名可以通过编译信息返回获得,比较长,目前我没有什么好的解决办法,有大佬知道的话可以分享一下。

类型名:detail::binomial_heap<int, greater<int>, allocator<char>>::point_iterator

其中 binomial_heap 应根据具体使用哪个堆来变化名字。

五种堆均已测试,其中冗余计数二项堆和改良的 Fibonacci 堆(thin_heap)会 MLE,二叉堆会 RE,配对堆和二项堆均可通过,前者稍快一些,且内存偏少,但是差异均不大。

Code

以下是配对堆的模板代码:

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define N 1000010
using namespace std;
using namespace __gnu_pbds;
__gnu_pbds::priority_queue<int, greater<int>, pairing_heap_tag> q[N];
__gnu_pbds::detail::pairing_heap<int, std::greater<int>, std::allocator<char>>::point_iterator id[N];
signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);q[1].begin();int n, m, opt, x, y, z;cin >> n >> m;for (int i = 1; i <= n; i++){cin >> x;id[i] = q[i].push(x);}while (m--){cin >> opt;if (opt == 1){cin >> x;cout << q[x].top() << "\n";}else if (opt == 2){cin >> x >> y;q[x].join(q[y]);}else if (opt == 3){cin >> x >> y >> z;q[x].modify(id[y], z);}else{cin >> x >> y;q[x].erase(id[y]);}}return 0;
}

具体测试时间效率的时候我加上了快读快写,为了代码简洁性这里给出的是普通的关闭流同步,除了一位大佬手写的超大数据结构外,速度是最快的。

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

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

相关文章

MySQLMonitor: 黑盒测试Mysql实时监控辅助工具

MySQLMonitor MySQL实时监控工具(代码审计、黑盒测试辅助工具)使用 1.自行打包使用 git clone https://github.com/fupinglee/MySQLMonitorcd MySQLMonitormvn clean package -DskipTests=true打开target下的jar文件即可执行 2.直接下载使用 https://github.com/fupinglee/My…

初始mysql以及创建

mysql是一个客户端服务器结构的程序 mysql的服务器是真正的本体,负责保存和管理数据,数据都是保存在硬盘上 数据库服务器上可以把很多有业务上联系的表放在一起,构成一个逻辑上的数据集合登陆mysql 打开终端输入mysql -u root -p,然后显示这个就说明mysql客户端连接到了服务…

【论文阅读笔记】Transformer——《Attention Is All You Need》

论文地址:https://arxiv.org/pdf/1706.03762 代码地址:https://github.com/huggingface/transformers目录IntroductionBackgroundModel ArchitectureEncoderLN and BNDecoderAttentionMulti-head AttentionFeed-ForwardPostion Encoding IntroductionRNN,LSTM 处理时序信息的…

Trivy : 容器安全利器

在当今数字化时代,容器化技术已经成为软件开发和部署的重要组成部分。然而,随着容器数量的增加,安全问题也日益突出。为了确保容器环境的安全,我们需要一款强大的工具来检测容器中的漏洞。今天,我将为大家介绍一款优秀的容器漏洞扫描工具:Trivy Container Scanner。本文将…

Hive3.1.2搭建文档包含详细步骤及相关截图以及常见问题解决

hive-3.1.2分布式搭建文档 1、下载,上传,解压,配置环境变量# 1、解压(解压到上级目录) tar -zxvf apache-hive-3.1.2-bin.tar.gz -C..# 2、重名名 mv apache-hive-3.1.2-bin hive-3.1.2# 3、配置环境变量 vim /etc/profile# 4、在最后增加配置 export HIVE_HOME=/usr/loca…

dbeaver连接MySQL出现了 Public Key Retrieval is not allowed 错误

问题现象出现这个错误的原因 错误提示“Public Key Retrieval is not allowed”通常出现在尝试使用SSL(Secure Sockets Layer)连接到MySQL数据库时。这可能是由于以下原因之一导致的:MySQL服务器配置:MySQL服务器可能没有正确配置以允许公钥检索。 检查MySQL服务器的my.cnf…

进销存系统是什么?企业如何用好进销存系统?

很多老板都知道,面对激烈的竞争环境,进销存管理已经成为企业运营中不可或缺的一部分。无论是商品的采购、销售,还是库存管理,进销存系统的有效运作都直接影响着企业的资金流动、客户满意度以及市场竞争力。因此,如何高效地应用进销存管理系统,不仅关乎日常运营的顺畅,更…

【linux内核】 BCC Tools命令汇总

什么是BCC Tools 直接通过BPF指令编写BPF 程序是非常繁琐的事情,尤其对于运维人员来说,花70%的时间来编写一个BPF程序来实现一个检查点,不如花70%的时间来熟悉别人已经写好的BPF程序,并且把别人的BPF程序有效的串联起来形成自己分析问题的套路,等有了闲暇时间再去尝试突破…

20222311 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1. 实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

进销存系统怎么实施?进销存的实施流程解析

很多老板都知道,企业的日常运营中,进销存管理是至关重要的核心环节之一。它涉及到企业的采购、库存、销售等多个方面,直接影响企业的资金流动、库存控制及客户满意度。因此,如何有效实施进销存管理系统,已成为许多企业提升运营效率、降低成本、优化资源配置的重要任务。 随…

解决centos7.9镜像问题

解决方案 https://wiki.bafangwy.com/doc/719/ 安装chrome(https://www.cnblogs.com/zxqblogrecord/p/13171516.html)时出现以下问题: failure: repodata/repomd.xml from centos7: [Errno 256] No more mirrors to try. http://mirror.centos.org/centos/7/os/x86_64/repodat…