線段樹 資料結構專題學習

2022-05-05 06:15:12 字數 2308 閱讀 8335

這兩周是資料結構專題的學習,,被專題的題目虐得死去活來==

線段樹:簡單的說就是把【1,n】的區間二分,【1,(1+n)/2】左子樹,【(1+n)/2+1,n】右子樹

就這樣一直分下去,直到都是【x,x】這樣的區間。這樣就構成了一顆樹了^-^

有這樣一棵樹,我們就可以在節點中儲存區間的和啊,區間內的最大值啊,最小值等等。。這就是線段樹的附加資訊了,也是題目中的重點。。

我們可以用乙個陣列(長度為k)儲存原區間的初始值,然後根據這個建樹,所以這個樹的節點數最多為4*k;

對於每個節點i,其左子樹為i*2,右子樹為i*2+1,父母節點為i/2。該區間的sum為左右子樹區間和的和,最大最小值同理。。。

線段樹的建立,修改,查詢都是用遞迴寫的。

所以在對單個數值時,必定會影響到其祖先節點,所以從上往下寫。遞迴後修改節點資訊。

線段樹的查詢也是如此,從上向下查詢。

先貼模板

1 #include 2

3using

namespace

std;45

#define mp make_pair

6#define pb push_back

7 typedef long

long

ll;8 typedef pairpii;

9const

double eps=1e-8;10

const

double pi=acos(-1.0

);11

const

int k=1e6+7;12

const

int mod=1e9+7;13

1415

struct

node16;

20struct node tree[4*k];

21int

a[k];

22void build(int id,int l,int

r)2333}

34int querymax(int id,int l,int

r)35

46int querysum(int id,int l,int

r)47

58void update(int id,int pos,int

v)5970}

71int main(void)72

帶區間修改的版本:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 

1213

#define pi acos((double)-1)

14#define e exp(double(1))

15using

namespace

std;

16#define k 10000

17struct

node18;

22struct node tree[4*k];

23int

a[k];

24void build(int id,int l,int

r)25

31else

3238}39

void pushdowm(int

id)4049}

50int querymax(int id,int l,int

r)51

68return

ret;69}

70int update(int id,int pos,int

v)71

76else

7784

return0;

85}86void update_interal(int id,int l,int r,int

v)87

92pushdowm(id);

93int mid=(tree[id].left+tree[id].right)>>1;94

if(r<=mid)

95 update_interal(id*2

,l,r,v);

96else

if(l>mid)

97 update_interal(id*2+1

,l,r,v);

98else

99104

}105

int query(int id,int l,int

r)106

117}

118119

int main(void

)120

view code

( 資料結構專題 ) 權值線段樹

資料結構專題 權值線段樹 學習權值線段樹,首先要了解線段樹是什麼。如果不會的可以先學習一下。權值線段樹,顧名思義是一棵線段樹。但它和普通線段樹不同 線段樹,每個節點用來維護一段區間的最大值或總和等。權值線段樹,相當於乙個桶,每個節點用來表示乙個區間的數出現的次數。我們可以用它來維護一段區間的數出現的...

樹鏈剖分 專題,學習記錄

理解了上面的那個部落格中的想法之後,你可以看這個神犇寫的 spoj上的 第一版 調了一下午 半晚上,第一次a的時候那真是excited include include include include include include using namespace std typedef long l...

資料結構 線段樹

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