樹狀數組

先貼一個模板代碼:html

int lowbit(int i)
{
    return i & -i;
}
//這裏的查詢以區間和爲例
void query(int i)
{
    int ans = 0;
    while(i > 0)
    {
        ans += c[i];
        i -= lowbit(i);
    }
    return ans;
}
//這裏的單點更新以加法爲例
void update(int i, int val)
{
    while(i <= n)
    {
        c[i] += val;
        i += lowbit(i);
    }
}

我的理解:數組

  幾個關鍵點,首先是 lowbit(i) :指 i 的二進制表示中最低位1及其後續的0組成的數字大小。例如,lowbit(6)中6的二進制表示爲110,其最低位1及其後續0組成的二進制數字爲10,即十進制的2,因此lowbit(6) = 2。接着是查詢和更新操做中,各個區間之間的聯繫。對於查詢操做,要查詢的原區間好比是 c[i] ,發現c[i] = c[p] + c[q] + c[r] ,這幾個子區間和原區間之間是有聯繫的,它們的關聯就是 i - lowbit(i) == p , p - lowbit(p) == q , q - lowbit(q) == r ,因此查詢操做中 i -= lowbit(i)。而更新操做是自底向上更新,和查詢的自頂向下查詢恰好相反,因此更新操做中 i += lowbit(i)。spa

  樹狀數組可以解決的問題,線段樹幾乎都能作,可是樹狀數組的寫法簡單,代碼簡潔code

具體理解細節能夠參考這篇博客:http://www.javashuo.com/article/p-hctcmmra-du.htmlhtm

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息