樹狀陣列區間求和與區間最值

2021-08-21 18:14:07 字數 1266 閱讀 4384

//樹狀陣列區間求和

//修改的時間複雜度為o(logn) 查詢的時間複雜度為o(logn)。

/*lowbit函式這個函式的功能就是求某乙個數的二進位制表示中最低的一位1。

舉個例子,x = 6,它的二進位制為110,那麼lowbit(x)就返回2,

因為最後一位1表示2。 而樹狀陣列的求和與下標的二進位制有關,詳情見圖

add函式即修改區間和

query函式即查詢區間和(從1到k),

查詢a~b的區間和只需query(a)-query(b)。*/

#include

using

namespace

std;

const

int n = 100005;

int n;

int dp[n] = ;

int lowbit(int k)

void add(int k,int num)

}int query(int k)

return res;

}int main()

int q; cin >> q;

while(q--)

return

0; }

//樹狀陣列求區間最大值

//初始化的時間複雜度為o(nlog(n)),

//修改的時間複雜度為log(n)*log(n),

//查詢的時間複雜度為o(logn)。

/*與區間求和相似,初始化時樹狀陣列的每個節點儲存的是所包含的區間的最大值,

當查詢的時候,利用lowboit函式跳躍查詢,使得時間複雜度減小至logn

當修改時,需要修改的是指定區間上的最大值, */

#include

#include

using

namespace

std;

const

int n = 100005;

int a[n] = ;

int dp[n] = ;

int n;

int lowbit(int k)

void init() //初始化

}void maxn(int x, int y) //修改,將第x個元素改為y

}}void query(int l, int r) //查詢

cout

<< ans;

}int main()

樹狀陣列 區間求和

樹狀陣列 是乙個查詢和修改複雜度都為log n 的資料結構,假設陣列a 1.n 那麼查詢a 1 a n 的時間是 log n 級別的。所以如果要解決 陣列中的元素不斷被修改,怎麼才能快速地獲取陣列中連續m個數的和 這個問題的話,用樹狀陣列就再好不過了 首先,什麼是樹狀陣列呢?樹狀陣列就是用另外乙個陣...

樹狀陣列維護區間最值

題目描述 給你乙個1 n的排列和乙個棧,入棧順序給定 你要在不打亂入棧順序的情況下,對陣列進行從大到小排序 當無法完全排序時,請輸出字典序最大的出棧序列 輸入描述 第一行乙個數n 第二行n個數,表示入棧的順序,用空格隔開,結尾無空格 輸出描述 輸出一行n個數表示答案,用空格隔開,結尾無空格 示例1輸...

樹狀陣列之區間最值

數學原理 利用上面的性質,在樹狀陣列的尾部插入資料,來建立乙個樹狀陣列 void push int pos void update int pos,int v int pre c pos pos lowbit pos 父親的位置 更新父親 while pos n 沒有更新父親 else break ...