線段樹區間修改模板

2022-05-22 10:12:10 字數 2113 閱讀 4466

本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。

不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。

可也不能再拖了,在做題中也許有更多的體會。

模板一:

1 l r v 表示區間[l, r]所有元素都加上v

2 l r   表示查詢區間[l, r]的sum, min, max

sumv[o]的定義為:如果只執行節點o及其子孫節點的中的add操作,節點o對應區間中所有數之和

1

//線段樹區間修改2//

1 l r v 表示區間[l, r]所有元素都加上v3//

2 l r 表示查詢區間[l, r]的sum, min, max4//

sumv[o]的定義為:如果只執行節點o及其子孫節點的中的add操作,節點o對應區間中所有數之和

5 #include 6 #include 7 #include 8

using

namespace

std;910

const

int maxnode = 1

<< 17;11

12int

_sum, _min, _max, op, ql, qr, v;

1314

struct

intervaltree

1528

if(addv[o]) 29}

3031

void update(int o, int l, int

r)32

41maintain(o, l, r);42}

4344

void query(int o, int l, int r, int

add)

4552

else

5358}59

}tree;

6061

const

int inf = 1000000000;62

63int

main()

6473

else

7479}80

}8182return0;

83 }

**君模板二:

線段樹區間修改set

1 l r v 表示將區間[l, r]全部賦值為v (v >= 0)

2 l r   表示查詢區間[l, r]的sum, min, max

1

//線段樹區間修改set2//

1 l r v 表示將區間[l, r]全部賦值為v (v >= 0)3//

2 l r 表示查詢區間[l, r]的sum, min, max

4 #include 5 #include 6 #include 7

using

namespace

std;89

const

int maxnode = 1

<< 17;10

11int

_sum, _min, _max, op, ql, qr, v;

1213

struct

intervaltree

1427

if(setv[o] >= 0) 28}

2930

//標記傳遞

31void pushdown(int o, int l, int

r)3239}

4041

void update(int o, int l, int

r)42

52maintain(o, l, r);53}

5455

void query(int o, int l, int

r)56

63else

if(ql <= l && r <=qr)

64

69else

70 75}

76}tree;

7778

const

int inf = 1000000000;79

80int

main()

8192

else

9398}99

}100

101return0;

102 }

**君

模板 線段樹(區間修改)

1 include 2 include 3 include 4 include 5 include 6 using namespace std 7const int maxn 100000 10 8 9 update a dd 把a l a r 的值全部加v add 10 update s et 把...

模板 線段樹 區間修改

與上篇線段樹一起食用效果更佳 神奇線段樹 點選收穫幸福 一開始當然是暴力!會超時的否掉 不用暴力的話。就用 結合 了解吧。我不想畫圖。先建樹 建樹 void build tree int x,int y,int p int mid x y 2 build tree x,mid,p 2 build t...

線段樹 區間求和模板 (區間修改)

include include include include include include include include include define mem a memset a,0,sizeof a define mem2 a memset a,1,sizeof a define mod ...