首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMQ片段树中的Bug

RMQ片段树中的Bug
EN

Stack Overflow用户
提问于 2016-12-05 17:02:09
回答 1查看 63关注 0票数 0

我正在尝试构建一个用于执行RMQ的段树。不知何故,不管我查询的范围是什么,它都会返回0。

例如,我的数组是[ 1,2,3,4,5,6,7,8,9,10 ]。从索引3到5的RMQ应该给出4,但是我的代码总是输出0。

我的代码:

代码语言:javascript
复制
#include<bits/stdc++.h>

using namespace std;

#define ll long long

ll N, st[2*100000], arr[100000];

void build(int r, int lo,int hi) {
    if(lo==hi) {
        st[r] = arr[lo];
    } else {
        build(r<<1,lo,(lo+hi)>>1);
        build((r<<1)|1,((lo+hi)>>1)+1,hi);
        st[r] = min(st[r<<1],st[(r<<1)|1]);
    }
}

void update(int r,int lo,int hi,ll val,int i) {
    if(lo==hi) {
        st[r] = val;
    } else {
        int mid = (lo+hi)>>1;
        if(lo <= i && i <= mid) {
            update(r<<1,lo,mid,val,i);
        } else {
            update((r<<1)|1,mid+1,hi,val,i);
        }
        st[r] = min(st[r<<1],st[(r<<1)|1]);
    }   
}

ll query(int r,int lo,int hi,int a,int b) {
    if(lo > b || hi < a) {
        return LLONG_MAX;
    } else if(lo <= a && hi >= b) {
        return st[r];
    } else {
        int mid = (lo+hi)>>1;
        return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));
    }
}

int main(void) {
    for(int i = 0; i <= 10; i++) arr[i] = i;
    build(1,0,10);
    cout << query(1,0,10,3,5) << endl;
    return 0;
}

编辑:

谢谢你的帮助。和下面提到的答案一样,我的查询范围是错误的。除此之外,还有两个bug:

if(lo <= a && hi >= b)应该是(a <= lo && b >= hi)

return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));

应该是

return min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));

因为我只是在查询,所以不应该修改树。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 17:33:49

这一行代码:

代码语言:javascript
复制
return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));

为什么您要更改您的ab --简而言之--您在每次递归调用中都要更改您的查询。它应该是

代码语言:javascript
复制
 return st[r] = min(query(r<<1,lo,mid,a,b),query((r<<1)|1,mid+1,hi,a,b));

您的更新功能也是错误的:

检查这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40979486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档