起因是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(log2n) 的复杂度
split(x,_T)是分裂函数,将小于等于x(注意这里会服从重载的运算符)的元素留在原树,其余元素属于 _T ,复杂度同上