線段樹 以及樹狀陣列

2021-10-01 19:19:31 字數 1152 閱讀 2395

樹狀陣列 o(logn)

n/2+n/4+…+1 =2n 這是從1-n-1層的節點數

假設最後一層節點數 是2n 那麼一共的節點數 是4n

主要解決的問題:單點修改 區間查詢

字首和o(1)只能解決區間查詢問題 並不能為我們解決單點修改問題

字首和 用樹狀陣列

單點修改   o(n)   o(logn)

區間查詢   o(1)  o(logn)

總時間複雜度 o(n) o(logn)

樹狀陣列兩個操作:

void add(int x, int v)   在x位置上+v

int query(int x)   查詢從1-x區間上的和

注意:

一般能用樹狀陣列解決的問題  我們就用樹狀陣列解決;

如果樹狀陣列不能解決的問題 我們用線段樹解決

注意:線段樹 我們都是從根節點1開始操作的

線段樹我們儲存結點是 用結構體陣列來儲存的(與heap相似)

主要解決的問題:單點修改 區間查詢

線段樹四個操作:

void pushup(int u)

//在一段區間初始化線段樹

void build(int u, int l, int r)

; //如果我們當前是葉子節點 那麼這個權值就是w[r/l]

else

;int mid = l + r >> 1; //否則我們就要二分

build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);

pushup(u); //最後回溯時候 我們更新當前這個結點的權值}}

//從根節點開始 查詢a~b區間的和

int query(int u, int l, int r)

//表示第 a 個數加 b

void modify(int u, int x, int v)

線段樹,樹狀陣列,主席樹

樹狀陣列 主席樹 包括無修改和可修改。用乙個滿二叉樹 葉子節點可以為空 來維護乙個連續陣列,整個樹的所有葉子節點從左到右表示整個陣列,每個非葉子節點表示其所有葉子的集合所描述的乙個連續子陣列的某一特性 最小值,最大值等 可以在logn的複雜度內實現對任意連續欄位的給定特性的查詢 最小值等 可以在lo...

線段樹 劃分樹 樹狀陣列

線段樹 利用陣列來維護乙個類似字首和的區間和 在查詢的時候查這個區間陣列 特殊操作 有延時標記 在區間陣列上增加基本不改變原來陣列 以達到節省時間的目的 樹狀陣列 和線段樹類似 乙個用乙個陣列維護類似字首和的東西 但 是 它維護的是乙個用二進位制表示的字首和 舉個例子 1是1 2是1 2 3是3 4...

Apple Tree(樹狀陣列 線段樹)

description 3 1 2 1 3 3 q 1 c 2 q 1 sample output 3 2 題目大意 一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。樹狀陣列版 include...