首页 > 其他分享 >题解:P11266 【模板】完全体·堆

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

时间:2024-11-08 19:58:37浏览次数:1  
标签:opt 迭代 题解 cin pb P11266 heap ds 模板

也算是对 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;
}

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

标签:opt,迭代,题解,cin,pb,P11266,heap,ds,模板
From: https://www.cnblogs.com/wryyy-233/p/18535842

相关文章

  • Hive3.1.2搭建文档包含详细步骤及相关截图以及常见问题解决
    hive-3.1.2分布式搭建文档1、下载,上传,解压,配置环境变量#1、解压(解压到上级目录)tar-zxvfapache-hive-3.1.2-bin.tar.gz-C..#2、重名名mvapache-hive-3.1.2-binhive-3.1.2#3、配置环境变量vim/etc/profile#4、在最后增加配置exportHIVE_HOME=/usr/local/......
  • C++ 可变参数模板递归展开
    #include<iostream>usingnamespacestd;template<typenameHead,typename...Tail>doubleMax(Headfirst,Tail...rest){doubleMaxnum=0;Maxnum=Max(rest...);if(Maxnum<first)Maxnum=first;returnMaxnum;}......
  • C++ 模板实参推断和引用折叠
    两个例外规则假定i是一个int对象,我们可能认为像£3(i)这样的调用是不合法的。毕竟,i是一个左值,而通常我们不能将一个右值引用绑定到一个左值上。但是,C++语言在正常绑定规则之外定义了两个例外规则,允许这种绑定。这两个例外规则是move这种标准库设施正确工作的基础。第一个例......
  • P1525 NOIP2010 提高组 关押罪犯 题解
    Link:P1525NOIP2010提高组关押罪犯-洛谷分析首先题目给出了罪犯与罪犯之间的矛盾关系,这让我们可以想到图或并查集。然后,题目又说了要把罪犯分入两个监狱,也就是把罪犯看作点,要把这些点分入两个集合,这很自然地可以想到二分图。再然后,市长只会去看列表中的第一个事件的影响力......
  • 题解
    最近模拟赛抽象题太多了,让他们聚一聚T1多校A层冲刺NOIP2024模拟赛18T3DBA暴力比较显然,直接数位dp就好,记搜的复杂度是\(O(n^4)\)的,用递推加前缀和优化可以优化为\(O(n^3)\),但我还是不理解\(O(n^3)\)凭啥能\(拿97pts\),虽然和正解没啥关系,但还是放一下记搜的代码:点击查看代码......
  • CF1995 题解
    B有n种物品,每种物品价格为$a_i$,数量为$c_i$。要求选取物品的方案,满足价格极差不超过1,价格总和不超过m。最大化价格总和。$n\le10^5,m\le10^{18},a_i,c_i\le10^9,a_i\neqa_j$显然只有\(x\)和\(x,x+1\)两种选择情况。\(x\)直接贪心选即可,考虑\(x,x+1\)。发......
  • C++ 模板参数的两种类型转换
    与非模板函数一样,我们在一次调用中传递给函数模板的实参被用来初始化函数的形参。如果一个函数形参的类型使用了模板类型参数,那么它采用特殊的初始化规则。只有很有限的几种类型转换会自动地应用于这些实参。编译器通常不是对实参进行类型转换,而是生成一个新的模板实例。与往常一......
  • C++ 模板显式实例化
    //template.hpptemplate<typenameT>classDylan{public:Dylan(Tt);Tm_data;};//template.cpp#include"template.hpp"template<typenameT>Dylan<T>::Dylan(Tt){m_data=t;}templateclassDylan<int&g......
  • ICPC23沈阳区域赛 D. Dark LaTeX vs. Light LaTeX 题解
    D.DarkLaTeXvs.LightLaTeXThe2023ICPCAsiaShenyangRegionalContest(The2ndUniversalCup.Stage13:Shenyang)给两个字符串\(s,t\),长度分别为\(n,m\),现在分别取\(s,t\)的子串\(s',t'\),合成一个新的长度为偶数的字符串\(str=s'+t'\),记\(str\)的长度为......
  • C++关于DLL导出模板类和模板函数
    这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料。自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的OpenSource项目,确实如此。这里记录一下,方便下次查阅。1、宏定义说明:#ifdefDLL_PROJECT#defineTEMPLATE_IM_EXPORT__decl......