1

一段时间以来,我一直在尝试理解范围树,但我仍然无法理解。

有人可以通过实现向我解释吗,因为我想用它来解决 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]);
}

谢谢 :)

4

1 回答 1

0

你检查过通常的饼干罐吗?

比如Wikipedia,我在 Google 上找到的几个以前的讲座以及一个Stack Question

我没有在大学学习它的乐趣,但它似乎是一个有趣的数据结构。

于 2013-03-27T17:12:14.610 回答