模板 線段樹(區間修改)

2022-08-25 19:00:35 字數 1233 閱讀 3790

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:把a[l]~a[r]的值設為v_set

11//q

uery:計算子串行的元素和,最小值,最大值

1213

int sumv[2*maxn],minv[2*maxn],maxv[2*maxn];

14int addv[2*maxn], setv[2*maxn];

15int

y1, y2, v_add, v_set;

1617

void maintain(int o, int l, int

r) 24

else

if(r >l)

29 minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (r-l+1

);30}31

void pushdown(int

o) 38

if(addv[o] > 0

) 43}44

void update_add(int o, int l, int

r) 49

else

55maintain(o, l, r);56}

57void update_set(int o, int l, int

r) 63

else

69maintain(o, l, r);70}

71int

_min, _max, _sum;

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

add)

78else

if(y1 <= l && y2 >=r)

83else88}

89void

init()

以上**思路詳見白書即(劉汝佳《演算法競賽經典訓練指南》)第三章線段樹部分,需要注意的是:

1.set操作時需要將該結點add標識清除

2.pushdown操作以及maintain操作的位置

3.其他方面的問題詳見**

線段樹區間修改模板

本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。可也不能再拖了,在做題中也許有更多的體會。模板一 1 l r v 表示區間 l,r 所有元素都加上v 2 l r 表示查詢區間 l,r 的sum,min,max sumv o 的定義為...

模板 線段樹 區間修改

與上篇線段樹一起食用效果更佳 神奇線段樹 點選收穫幸福 一開始當然是暴力!會超時的否掉 不用暴力的話。就用 結合 了解吧。我不想畫圖。先建樹 建樹 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 ...