1 #include 2 #include 3 #include 4 #include 5 #include 6using
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 ...