BIT查询给定范围

时间:2015-01-09 15:29:01

标签: algorithm binary-indexed-tree

我们有一个数组arr [0。 。 。 N-1]。我们应该能够有效地找到从索引qs(查询开始)到qe(查询结束)的最小值,其中0 <= qs&lt; = qe&lt; = n-1

我知道数据structure Segment树。我想知道Binary Index Tree (BIT)是否也可以用于此操作。

如果是,请问我如何在这种情况下使用BIT并且数组是静态的,可以我们更改元素并更新我们的BIT或Segment Tree。

1 个答案:

答案 0 :(得分:0)

是的,BIT也可以通过一个小技巧解决这个问题。

让我们使用num []表示init数组,idx []表示BIT数组。

关键点是我们应该使用idx [k]表示范围num [k-lowbit(k)+ 1,k]的最小值,k从1开始。

   #define MAX_VALUE 10000
   #define lowbit(x) (x&(-x))
   int num[MAX_VALUE];
   int idx[MAX_VALUE];
   void update(int pos, int val, int max_index) {
       num[pos] = val;
       while (pos < max_index) {
            idx[pos] = min(idx[pos], val);
            pos += lowbit(pos);
       }
   } 

   int getMin(int left, int right) {
        int res = num[right];
        while (true) {
            res = min(res,num[right]); 
            if(left == right)break; 
            for(right-=1;right-left>=lowbit(right);right-=lowbit(right)){ 
                res=min(res,idx[right]); 
            } 
        }
        return res;
   }
希望可以帮助你。