关于pbds平衡树合并
  • 板块灌水区
  • 楼主_WRYYY_
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/10/28 10:23
  • 上次更新2023/11/2 11:07:40
查看原帖
关于pbds平衡树合并
333709
_WRYYY_楼主2023/10/28 10:23

起因是tree的join需要保证两棵树上下界不交,但这很难做到,所以我就自己写了一个合并函数,结果爆栈了(实际就是写假了),目前我还没有找到很好的解决办法,请教一下各位大佬怎么样才可以保证时间复杂度的情况下,合并两颗平衡树。

如下是我写的合并代码

treeint trge(treeint _A, treeint _B)
{
	if (_A.size() < _B.size())
		_A.swap(_B);
	if (_B.empty())
		return _A;
	if (_B.size() <= 10)
	{
		for (auto x : _B)
			_A.insert(x);
		return _A;
	}
	treeint _T;
	_A.split(*_B.begin(), _T);
	_A.join(_B);
	return trge(_A, _T);
}

这里提供一下上面各个函数以及特定名称的解释

treeint 是我进行了对 tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update> 的宏定义,根据情况会对类型更改,比如需要重复会改成 pair 。

join是上文提到的,将一颗树合并到另一颗树的函数,被 join 的那颗树会被清空。O(log⁡2n)O(\log_2n) 的复杂度

split(x,_T)是分裂函数,将小于等于x(注意这里会服从重载的运算符)的元素留在原树,其余元素属于 _T ,复杂度同上

2023/10/28 10:23
加载中...