1. 程式人生 > >樹狀陣列之區間求最值

樹狀陣列之區間求最值

       經過近幾天的學習,發現樹狀陣列不僅可以解決區間求和問題,還能很好的解決區間求最值的問題!(是的,不會線段樹也沒關係!光有樹狀陣列包就您滿意!)好了開始具體介紹這個方法~

  用樹狀陣列求區間和就是利用了其靈巧方便的區間劃分方法,同樣,利用這個區間劃分方法是可以求一個序列的最值的。這個需要開一個新的c【】陣列來儲存在一個區間的最值(以求最小值為例),c【i】表示的就是【i-lowbit【i】+1,i】的最小值。以num【】陣列來儲存區間的值;

首先要記得對num陣列和c陣列進行合理初始化;(根據所求最值不同進行不同初始化);

 存值的時候要注意一下~

void add(int x, int d)
{
    num[x] = d;
    while(x <= n)
    {
        if(c[x] > d)
        {
            c[x] =  d;
        }
        else
        break;
        x  = x + lowbit(x);
    }
}

我們需要注意的就是查詢的時候了,如果不在一個區間裡面的話就只能在查完這個大區間所有包含的子區間內最小值之後再跟餘下的元素挨個比較就行了

int find_c(int l,int r)
{
    int ans = num[r];
     while(l != r)
    {
        r--;
        while(r - lowbit(r) > l)
        {
            ans = min(ans, c[r]);
            r -= lowbit(r);
        }
        ans = min(ans, num[r]);
    }
    return ans;
}

注意一下我們比較的時候是按照逆序查詢的來比較的,小心不要拉掉元素;

剩下的工作就只是注意一下輸入輸出工作就好了~

一道求區間最大值的題目~看完可以去ac~