樹狀陣列總結

2021-10-08 17:48:47 字數 993 閱讀 5374

樹狀陣列告一段落了,我做了不少相關的練習題,這篇部落格主要來講一下這段時間做題時的一些感想。

首先我認為樹狀陣列也可以說是乙個工具,因為它的寫法是唯一的,應用場景也是固定的。它不像線段樹這樣的資料結構,對於不同的題目/不同的要求,線段樹中維護的輔助資訊也是不同的。我做了不少樹狀陣列的題目,樹狀陣列的寫法是都是一樣的(我只見過一種擴充套件用法),用法也是固定的,都是單點修改和區間和查詢這兩個操作。因此我認為:樹狀陣列和字首和、離散化、排序這樣的知識點都是用法固定的工具,當有特定的需要時就直接拿來用即可。例如:當需要將給定序列進行排序時就要用排序操作,當需要進行快速的單點修改+區間和查詢時就需要用到樹狀陣列……

因為樹狀陣列的應用十分的固定,因此關於樹狀陣列題目的難點一般也不是樹狀陣列這個資料結構本身。樹狀陣列題目的難點在於:如何把乙個題目變成乙個只需要單點修改和區間和查詢這兩個操作就可以得到最後要求的資訊的這個過程,即我們如何才能在這個題上用上樹狀陣列求解答案。我在做樹狀陣列相關練習時經常有不會做的題目,而不會做的原因大多數是因為我不知道這個題怎麼才能用樹狀陣列進行求解,一旦知道了這道題怎麼才能用上樹狀陣列來求解答案,那這道題基本上就算是做出來了。而線段樹的題目很多時候的難點在於如何把輔助資訊求出來,有時候即使知道了如何用線段樹求解這道題,求出線段樹維護的輔助資訊也是乙個大的難題。

我發現大多數用樹狀陣列能求解的題目,用線段樹也都能求解,剛開始我還覺得這件事挺神奇的,但後來仔細想了想,確實也沒有什麼問題,因為用線段樹可以單點修改和區間和查詢這兩個樹狀陣列的主要操作。線段樹的應用範圍要比樹狀陣列大的多。

樹狀陣列的應用場景相比於其他資料結構或演算法來說其實並不多,比較典型的用法也不是很多,我在做題的時候遇見了很多用法上重複的題目。在這我總結一下:

區間修改+單點查詢(樹狀陣列維護乙個差分陣列):乙個簡單的整數問題

區間修改+區間和查詢(多個樹狀陣列共同維護資訊):乙個簡單的整數問題2

查詢一段序列中的某乙個數的左邊/右邊有多少大於/小於它的數(樹狀陣列維護乙個桶):樓蘭圖騰

擴充套件用法:樹狀陣列維護區間最值:balanced lineup g

樹狀陣列總結

樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...

樹狀陣列總結

樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...

樹狀陣列總結

今天學習了一下樹狀陣列,做乙個簡單總結。樹狀陣列可分為兩種操作,1 修改單個點,統計區間和 一般為 向上修改 update1 向下統計 sum1 2 修改區間,統計單個點 一般為向下修改 update2 向上統計 sum2 主要模板如下 int c n int lowbit int x 用於確定區間...