首页 > 其他分享 >LuoguP3377 【模板】左偏树(可并堆)

LuoguP3377 【模板】左偏树(可并堆)

时间:2022-10-08 09:23:04浏览次数:55  
标签:ll 个数 fa maxn LuoguP3377 find 模板 左偏

题意

如题,一开始有 \(n\) 个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:

  1. 1 x y:将第 \(x\) 个数和第 \(y\) 个数所在的小根堆合并(若第 \(x\) 或第 \(y\) 个数已经被删除或第 \(x\) 和第 \(y\) 个数在用一个堆内,则无视此操作)。

  2. 2 x:输出第 \(x\) 个数所在的堆最小数,并将这个最小数删除(若有多个最小数,优先删除先输入的;若第 \(x\) 个数已经被删除,则输出 \(-1\) 并无视删除操作)。

对于 \(100\%\) 的数据:\(n\le 10^5\),\(m\le 10^5\),初始时小根堆中的所有数都在 int 范围内。

思路

【模板】左偏树?【模板】启发式合并!

左偏树这种不常用的 useless algo 想来想去也没啥实战意义,真要说的话也完全可以用动态开点权值线段树的线段树合并来上位替代。

于是我们就有了充分的理由用邪道来艹题。

由于只有合并莫得分裂,考虑启发式合并。每次将较小的堆向较大的堆合并即可做到均摊复杂度 \(O(n\log n)\)。使用并查集维护所有点的所属堆。

对于删除直接弹堆顶然后打标记即可。

代码

“ 主播,set 是你爹?用小根堆压掉取堆顶的一个 \(\log\) 会死?”


const ll maxn=1e5+5;
ll fa[maxn];
bool del[maxn];
ll find(ll x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(ll x,ll y){
	ll u=find(x),v=find(y);
	fa[u]=v;
}
struct node{
	ll val,id;
	friend bool operator < (const node &x,const node &y){
		return x.val==y.val?x.id<y.id:x.val<y.val;
	}
};
set<node>s[maxn];
ll n,m;
void solve(){
	n=R,m=R;
	for(ll i=1;i<=n;i++){
		fa[i]=i;
		ll x=R;
		s[i].insert((node){x,i});
	}
	while(m--){
		ll opt=R,x=R;
		if(opt==1){
			ll y=R;
			if(del[x]||del[y]||find(x)==find(y)){
				continue;
			}
			ll u=find(x),v=find(y);
			if(s[u].size()<s[v].size())swap(u,v);
			while(!s[v].empty()){
				auto it=s[v].begin();
				s[u].insert(*it);
				s[v].erase(*it);
			}
			merge(v,u);
		}
		else {
			if(del[x]){
				puts("-1");
				continue;
			}
			ll u=find(x);
			auto it=s[u].begin();
			//if(s[u].empty())cerr<<"zmhsn?"<<endl;
			we(it->val);
			del[it->id]=1;
			s[u].erase(*it);
		}
	}
	return ;
}

标签:ll,个数,fa,maxn,LuoguP3377,find,模板,左偏
From: https://www.cnblogs.com/rnfmabj/p/luogup3377.html

相关文章

  • datax Steam模板
    ./datax.py-rstreamreader-wstreamwriter仅限于Steam方式{"job":{"content":[{"reader":{......
  • 脚本模板
    必不可少的Linux运维脚本!!!公子 Cloud研习社 2022-09-2107:31 发表于山东收录于合集#实战经验51个#linux89个#云计算57个#shell34个#计算机59个 一......
  • P3919 【模板】可持久化线段树 1(可持久化数组)
    还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[]中的数。1#include<bits/stdc++.h>2usingnamespac......
  • 看到一段代码,留个脚印_2(封装或者说是模板)
    2022年6月的时候玩wow3.35版本的时候,目标的目标以及目标的目标的目标是这样的,突发奇想,能不能把目标的目标以及目标的目标的目标头像翻转,就是头像在右,血条在左,和目标框体一......
  • C++模板类-数组
    /*Container.h所有容器的基类/*MemoryObject内存申请基类我使用TBB申请内存*/template<typenameT> classContainer:publicMemoryObject { protected: T*C......
  • C++模板基础知识
    源码编译环境:win10x86反汇编软件:IDAPro(胖大妈)第一次接触到模板是在C#的泛型编程,对其表面的理解是可以对一些约束范围内参数类型的方法进行重用,可以少写一些方法。在后......
  • 【模板】筛法
    \(prime\)constintN=1e7+10;intprime[N];boolnotprime[N];intminprime[N];voidprime_sieve(constintmaxn){ registerinti,multi_helper; registerin......
  • 微信小程序排行榜页面模板
    1需求在开发一款背单词的微信小程序时,为了加强用户的体验感,刺激用户积极学习,小程序中需要有排行榜的模块。通过打开天数来排名,让用户有攀比学习的心里。具体的页面截图如......
  • 模板基类与正确的派生类函数调用--Effective C++ Item 43
    问题描述假设我们有这样一个业务场景,我们管理着许多公司,每个公司都有一个自己的许多日志信息需要处理,于是为了方便,我们写了一个模板类用来处理这些公司的信息,并且将这些公......
  • 设计模式系列1 - 模板模式&策略模式
    分别讲述模板模式和策略模式的使用姿势,以及两者的区别,基于java。往期精选(欢迎转发~~)Java全套学习资料(14W字),耗时半年整理消息队列:从选型到原理,一文带你全部掌握肝了......