寫之前先膜拜一下最近教我樹狀陣列的大神orzorzorz..【啊。。發現這裡講得很清楚= =...mark】
看了一下有關於樹狀陣列的基礎題,大概就是關於樹狀陣列的原理運用以及基本的功能實現。
這裡先把樹狀陣列的功能理一下
1.點修改
2.區間和的查詢
(論線段樹和樹狀陣列的區別....)
簡要的說一下,要實現以上功能主要是要了解:
1.lowbit的作用
2.初始化:字首和(詳見**①)
3.區間和的查詢運用的區間的相關運算(什麼區間加法,區間減法啥的),詳見**②
廢話不說了要睡覺了嗯
扔上題目和**嗯,原理的話等我某哪天組織好語言再來,以及poj3468
【問題描述】給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。
輸入資料第一行包含兩個正整數n,m(n<=100000,m<=500000),以下是m行,
每行有三個正整數k,a,b(k=0或1, a,b<=n).k=0時表示將a處數字加上b,k=1時表示詢問區間[a,b]內所有數的和。對於每個詢問輸出對應的答案。
【輸入樣例】
10 20
0 1 10
1 1 4
0 6 6
1 4 10
1 8 9
1 4 9
0 10 2
1 1 8
0 2 10
1 3 9
0 7 8
0 3 10
0 1 1
1 3 8
1 6 9
0 5 5
1 1 8
0 4 2
1 2 8
0 1 1
【輸出樣例】106
06166
2414
5041
#include#includeusing namespace std;long long a[100001],n,m;
int sum(int x)
void add(int x,int d)
int main()
else
} fclose(stdin);fclose(stdout);
return 0;
}
由於這一題比較特殊,剛開始的a陣列初始化為0,所以初始化不需要考慮打字首和這裡說一下,如果要求輸入a陣列值,則需要維護乙個b陣列//因為這裡需要修改單點的值,所以維護最初的陣列是不行的
所以,b陣列的初始化:
b[i]=b[i-1]+a[i];①//字首和,方便區間的運算
樹狀陣列實現線段樹區間修改區間查詢功能
已知樹狀陣列區間修改單點查詢時tree陣列中存放的是相鄰差值,那麼區間修改的基礎我們已經有了,但只能支援單點查詢,需要再構造區間查詢功能,暴力累加是不可能考慮的,而樹狀陣列的區間查詢是利用字首和實現的,tree陣列中儲存的是字首和。所以我們需要在單點查詢的基礎上再構造乙個字首和。我們需要整理一下查詢...
樹狀陣列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 下...