初識樹狀陣列

2022-08-16 13:36:16 字數 1319 閱讀 3771

描述 description

輸入乙個數列a1,a2….an(1<=n<=100000),在數列上進行m(1<=m<=100000)次操作,操作有以下兩種: (1) 格式為c i x,其中c為字元「c」,i和x(1<=i<=n,|x|<=10000)都是整數,表示把把a[i]改為x (2) 格式為q l r,其中q為字元「q」,l和r表示詢問區間為[l,r](1<=l<=r<=n),表示詢問a[l]+…+a[r]的值。

輸入格式 input format

第一行輸入n(1<=n<=100000),表述數列的長度; 接下來n行,每行乙個整數(絕對值不超過10000)依次輸入每個數; 接下來輸入乙個整數m(1<=m<=100000),表示運算元量,接下來m行,每行為c i x或者q l r。

輸出格式 output format

對於每個q l r 的操作輸出答案。

樣例輸入 sample input

1 2 3 4 5

q 2 3

c 3 9

q 1 4

樣例輸出 sample output

5 16

時間限制 time limitation

1s

首先感謝ysc為我們帶來的樹狀陣列ppt,閒話也不多說了,樹狀陣列的定義百科上也有,我也不在描述;

本來看到點修改的我其實很懵,因為**是這樣寫的

void build(int i,int

val)

}

這是一步步向上修改根節點,然而我們看到題目描述是修改某點的值為什麼,而不是加;

其實很容易,只要將要修改的值減去原來的值,賦給val就能實現。

**很簡單,要注意的是剛開始要建立c陣列。

#include#include

#include

#include

#define lowbit(i) i&(-i)

using

namespace

std;

intn,m;

int a[100100

];int c[100100

];int

ans;

void build(int i,int

val)

}int sum(int

x)

return

temp;

}int

main()

//cout>m;

for(int i=1;i<=m;++i)

else

if(c=='q'

) }

//cout}

初識樹狀陣列

針對乙個陣列,反覆的修改 求區間和,普通的寫法 修改 a index new value 求區間和 int sum 0 for int i begin i end i 這樣的寫法,若區間長度為m,求和次數為n,時間複雜度o mn 樹狀陣列的寫法,就是為了優化此類問題,尤其是字首和問題。針對字首和問題...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...