專題 線段樹 一

2022-07-06 17:15:18 字數 920 閱讀 5828

這同樣也是我上個星期學的內容,這個星期寫部落格來回顧一下,不然難免會忘記,○( ^皿^)っhiahiahia…

線段樹是一種弄個高效的對區間更新以及詢問的資料結構,包括詢問陣列一段區間的和,或一段區間的最大最小值,或者區間的最小公因數等等。並能將正常操作的o(n)的複雜度降低到o(logn),這無疑是一種翻天覆地的變化。

首先我們來看該如何構建一棵線段樹,這裡我們以維護區間和為例。

const int maxn = 1000;

int n, t[4*maxn];

void build(int* a, int v, int tl, int tr)

}

我們採用的是遞迴建樹,先建立子樹,再利用子樹的資訊來構建父節點。期中v代表的是當前節點,v的左孩子為v*2,v的右孩子為v*2+1,這裡為了方便起見,陣列下標從1開始算起。我們建立了左右子樹之後,我們就將左右子樹的sum值相加,就是當前節點的sum值。

接下來就是更新的維護了,為了簡單起見,我們先來做乙個單點修改,即零a[pos]加上addval。void update(int v, int tl, int tr, int pos, int addval)

void update(int v, int tl, int tr, int pos, int val)

}

我們採用的方法就是自底而上的逐級修改,首先修改葉子,再逐個節點向上更新,孩子更新之後,我們就更新父節點,用

t[v] = t[v*2] + t[v*2+1];
來實現。

最後我們講講如何查詢區間和,算了,上**吧,突然間心情不好了,哎

int sum(int v, int tl, int tr, int l, int r)

lazy標記下次講,大過年的,乙個新年快樂都沒有,我繼續自閉吧

線段樹專題

最最基礎的線段樹,只更新葉子節點,然後把資訊用pushup int r 這個函式更新上來。hdu1166 敵兵布陣 線段樹 hdu 1166 敵兵布陣 單點更新區間求和 hdu1754 i hate it 線段樹 hdu 1754 i hate it 單點更新 區間求最值 hdu1394 minim...

線段樹專題

題意 給定n個數 a1,a2,a na 1,a 2,dots,a n a1 a2 an 給出q個詢問求 l,r 內所有子區間的異或和。比如,陣列1,2,3中 1,3 的異或和為 1 1 xor2 1xo r2xo r3 2 2xo r3 3 1 1xor2 1xor2xor3 2 2xor3 3 1...

線段樹專題

敵兵布陣 單點更新,區間求和查詢 include include include include include using namespace std const int maxn 5e4 5 struct nodet maxn 4 int a maxn nsum void build int x...