错误的答案 - 无法找到错误 - 使用段树的范围最小查询

时间:2017-09-09 10:21:35

标签: java algorithm segment-tree rmq

我正在尝试通过https://www.topcoder.com/community/data-science/data-science-tutorials/range-minimum-query-and-lowest-common-ancestor/学习细分树 在了解了分段树的基础知识之后,我尝试解决this问题。但是只传递了一个测试用例,而在第二个测试用例中,我得到了。在进一步检查比较两个答案使用filediff我发现有错误的答案。我无法找到任何错误。请帮忙。

此代码用于创建和更新分段树。

变量 - node =段树中的起始索引,为1。 b =下限,e =上限

static void preProcess(int node, int b, int e, int[] segTree, int[] arr) {

    if(b == e){ //base case
        segTree[node] = b;
        return;
    }

    preProcess(node << 1, b, (b+e)>>1, segTree, arr); 
    preProcess((node << 1) + 1, ((b+e)>>1) + 1, e, segTree, arr);
    if(arr[segTree[node<<1]] <= arr[segTree[(node << 1) + 1]]) {
        segTree[node] = segTree[node<<1];
        return;
    }
    segTree[node] = segTree[(node<<1) + 1];


}

现在,此代码用于查询树中的最小索引。

    static int query(int node, int b, int e, int[] segTree, int[] arr, int i, int j) {
    // System.out.println(i+" "+j);
    // System.out.println(b+" "+e);
    if(i > e || j < b) {
        return -1;
    }
    if(b >= i && e <= j) {
        return segTree[node];
    }

    int p1 = query(node<<1, b, (b+e)>>1, segTree, arr, i, j);
    int p2 = query((node << 1) + 1, ((b+e)>>1) + 1, e, segTree, arr, i , j);
    if(p1 == -1) {
        segTree[node] = p2;
        return p2;
    }
    if( p2 == -1) {
        segTree[node] = p1;
        return p1;
    }
    if(arr[p1] <= arr[p2]) {
        segTree[node] = p1;
        return p1;
    }
    segTree[node] = p2;
    return p2;
}

这用于更新原始数组中的索引。

static void updateIndex(int index, int value, int[] arr) {
    arr[index - 1] = value;
}

我正在使用第一个索引的段数组。 有关完整代码,请参阅here

现在我已经更改了我的代码,以防在here看到后发生更新,但现在我收到了错误的答案 -

static void afterUpdate(int node, int b, int e,int index, int y,int[] segTree, int[] arr) {
     if(b == e){
         segTree[node] = index;
         return;
     }
     int mid = ((b+e)>>1);
     if(b <= index && mid >= index){
         afterUpdate((node<<1),b,mid,index,y,segTree,arr);
     }
     else {
         afterUpdate((node<<1)+1,mid+1,e,index,y,segTree,arr);
     }
     if(arr[segTree[node<<1]] <= arr[segTree[(node<<1)+1]]){
         segTree[node] = segTree[node<<1];
     }
     else 
        segTree[node] = segTree[(node << 1)+1];
 }

有关更新的完整代码,请参阅here

1 个答案:

答案 0 :(得分:2)

在查询最小索引时,您正在更新分段树。删除它,代码工作正常。在查询的情况下,不应更改segTree。