線段樹(2)區間修改

2021-07-06 05:30:39 字數 849 閱讀 3694

快速序列操作i,給出乙個n個元素的陣列a1,a2,…,an,你的任務是設計乙個資料結構支援一下兩種操作

set(l, r, v): 把al,al+1,…,ar的值全部修改為v(v>=0)

query(l, r):計算子串行al,al+1,…ar的元素和、最小值和最大值。

#include 

#include

using namespace std;

#define ll(x) x<<1

#define rr(x) x<<1|1

typedef long long int;

const

int maxn = 500;

int setv[maxn<<2] = , minv[maxn<<2], maxv[maxn<<2], sumv[maxn<<2], a[maxn<<2];

int _min, _max, _sum, v;

int y1, y2;

void buildtree(int l, int r, int o) else

}void maintain(int l, int r, int o) else

if (l < r)

}void pushdown(int o)

}void update(int l, int r, int o) else else

if (y2 > m) else

}maintain(l, r, o);

}void query(int l, int r, int o) else

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

}

模板 線段樹(2)區間修改

好像叫做懶操作來著。還是叫延遲修改更高大上一點吧 區間修改 兩種操作 add l r v 把a l a l 1 a r 的值全部增加v query l r 計算子串行a l a l 1 a r 的元素和,最小值和最大值 修改 查詢的範圍均為 y1,y2 維護節點o,它對應區間 l,r void ma...

線段樹002 區間修改

接下來講解一下區間修改 比如在下面這個圖中我要將1 5區間的值全都改為v 正常人的思維是把1 5這個區間的修改看成對點1,2,3,4,5的單點修改 但這樣的複雜度是nlog n 是比較高的 我們換一種想法,在修改區間的時候我們仍然像區間查詢一樣自上而下的尋找要修改的區間。那麼我們最後 找到區間是1 ...

線段樹2(區間更新)

區間更新是指更新某個區間內的葉子節點的值,因為涉及到的葉子節點不止乙個,而葉子節點會影響其相應的非葉父節點,那麼回溯需要更新的非葉子節點也會有很多,如果一次性更新完,操作的時間複雜度肯定不是o lgn 例如當我們要更新區間 0,3 內的葉子節點時,需要更新出了葉子節點3,9外的所有其他節點。為此引入...