我一直试图了解范围树,但我仍然无法理解它。
有人可以通过实现向我解释,因为我想用它来解决2D RMQ,我知道段树,而我的老师告诉我范围树类似于2d段树,但我只是想不到如2d分段树那样空间复杂度如何小于n ^ 2。
我不确定这一点,但确实如此,它就像合并排序一样,所以内存将小于n ^ 2使用vector
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]);
}
谢谢:)
答案 0 :(得分:0)
你检查过通常的饼干罐吗?
例如Wikipedia,我在Google上找到的former lecture个Stack Question以及{{3}}除了
我没有在大学学习它的乐趣,但它似乎是一个有趣的数据结构。