一段时间以来,我一直在尝试理解范围树,但我仍然无法理解。
有人可以通过实现向我解释吗,因为我想用它来解决 2D RMQ,我知道分段树,我的老师告诉我范围树类似于 2d 分段树,但我就是想不出空间如何复杂度可以小于 n^2,如 2d 段树。
我不确定这一点,但它是真的吗,它就像合并排序,所以内存将小于 n^2 使用向量
void merge(vector<int> &res,vector<int> &a,vector<int> &b)
{
int la = 0;
int lb = 0;
int sa = SIZE(a);
int sb = SIZE(b);
while(la < sa || lb < sb)
{
if (la >= sa) {res.pb(b[lb]);lb++;}
else if (lb >= sb) {res.pb(a[la]);la++;}
else
{
if (a[la] < b[lb]) {res.pb(a[la]);la++;}
else {res.pb(b[lb]);lb++;}
}
}
}
void build(int n,int l,int r)
{
if (l == r)
{
rtree[n].pb(ar[l]);
return;
}
int m = (l+r)/2;
build(2*n,l,m);
build(2*n+1,m+1,r);
merge(rtree[n],rtree[2*n],rtree[2*n+1]);
}
谢谢 :)