高階資料結構 線段樹

2021-09-26 06:12:25 字數 2829 閱讀 6577

今天是很沉重的一天,進來ccf官宣取消oi,也不知道是不是真的。

oier們不要放棄夢想!大家一定要勇往直前!

這線段樹會很難…至少我是這麼想的…不過我也是經過百般實驗才敢寫這個部落格!

假定我給你乙個定區間,讓你以最快的速度做這樣的操作:修改其中的乙個子區間,查詢另乙個子區間的值,而且重複這些操作。你會說:for迴圈。沒錯,這複雜度是o(n)線段樹可以說是區間神器,它擁有四個處理區間的基本功能:單點查詢,單點修改,區間查詢,區間修改。除了建樹需要o(nlogn)的複雜度以外,其餘操作的複雜度是o(logn)。

先給乙個線段樹的圖吧。

這裡的數字是點標,不是點值。

詳細解析後續更新。

**裡提供微解析。

完整**如下:

#include

#include

#include

using namespace std;

#define maxm 10001

int n,a[maxm]

,sum[maxm]

,delta[maxm]

;void

update

(int x)

//這裡是統計左右兩個子節點的值並付給自己,每一次值更新都要update一次

//x<<1|1等價於x*2+1,位運算有什麼疑問可以去看下面的連線

////此函式用於標記下放

void

pushdown

(int now,

int l,

int r)

return;}

//遞迴建樹

void

build

(int now,

int l,

int r)

int mid=

(l+r)

>>1;

//遞迴處理左邊和右邊

build

(now<<

1,l,mid)

;build

(now<<1|

1,mid+

1,r)

;//處理完畢(分到最細)然後逐步統計上去

update

(now)

;return;}

//這個是單點修改

void

changepoint

(int now,

int l,

int r,

int x,

int v)

int mid=

(l+r)

>>1;

//記得下放懶惰標記

pushdown

(now,l,r)

;//在左邊(mid的左邊)就找左邊,反之找右邊

if(x<=mid)

else

//老規矩[手動滑稽],你改了你父親也要改,所以update

update

(now)

;return;}

//這是單點查詢

intaskpoint

(int now,

int l,

int r,

int x)

int mid=

(l+r)

>>1;

pushdown

(now,l,r)

;//簡直跟單點修改的過程一樣對吧

if(x<=mid)

else

//你看這裡查詢就不需要update

}int

askrange

(int now,

int l,

int r,

int tl,

int tr)

if(tr>mid)

return ans;

}void

changerange

(int now,

int l,

int r,

int tl,

int tr,

int v)

int mid=

(l+r)

>>1;

pushdown

(now,l,r)

;//處理左邊和右邊

if(tl<=mid)

if(tr>mid)

update

(now)

;return;}

intmain()

build(1

,1,n);

freopen

("con"

,"r"

,stdin);

int k,b,c;

char ju;

loop:cout<<

"你要做什麼"

<

cout<<

"1.區間修改"

<

"2.區間查詢"

<

"3.單點修改"

<

"4.單點查詢"

<

"5.退出"

<

cin>>ju;

if(ju==

'1')

else

if(ju==

'2')

else

if(ju==

'3')

else

if(ju==

'4')

else

if(ju==

'5')

goto loop;

fina:cout<<

"成功退出"

<

return0;

}

C 線段樹 高階資料結構

線段樹是一種平衡二叉搜尋樹 完全二叉樹 它將乙個線段區間劃分成一些單元區間。對於線段樹中的每乙個非葉子節點 a,b 他的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 最後的葉子節點數目為n,與陣列下標對應。線段樹的一般包括建立 查詢 插入 更新等操作,建立規模為n的時間...

資料結構 線段樹

啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...

資料結構 線段樹

一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...