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

2021-07-10 13:12:43 字數 1061 閱讀 7124

好像叫做懶操作來著。。還是叫延遲修改更高大上一點吧

//區間修改

/*兩種操作

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 maintain(int o, int l, int r)

minv[o] += addv[o];

maxv[o] += addv[o];

sumv[o] += addv[o] * (r-l+1);//考慮add操作

if(r==l) addv[o] = 0;

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

else

maintain(o, l, r); //遞迴結束前重新計算本節點的附加資訊

}int _min, _max, _sum; //全域性變數,目前位置的最小值、最大值和累加值

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

else

}

/*兩種操作:

set(l, r, v): 把a[l],a[l+1],,...,a[r]的值全部修改為v(v>=0)

query(l, r): 計算子串行a[l],a[l+1],...,a[r]的元素和、最小值和最大值

*/void update(int o, int l, int r)

else

maintain(o, l, r);

}//標記傳遞

void pushdown(int o)

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

else

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

else

}

上面set操作的maintain貌似需要重寫一下,等我找一道題目試一下再修改。

線段樹(2)區間修改

快速序列操作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 namesp...

線段樹002 區間修改

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

線段樹2(區間更新)

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