一開始學線段樹是跟zhx老師,用一個sum陣列代替結構體
但是發現sum陣列比較難打lazy標記,而且除錯非常非常困難
所以就跟著xxy老師用struct結構體存變數
感覺這種方式雖然比sum難寫一點但是比較容易理解
到現線上段樹的基本操作:
1.單點修改
2.單點查詢
3.區間修改(加減)
4.區間查詢
基本都掌握了,但是像區間加減乘除混合的聽別人說太高大上而且時間比較急就僅僅看看了思路,沒手動實踐
在敲線段樹的時候總結出了一點規律和經驗:
1.結構體的大小必須要開4*MAXN
2.所有的中間值m都是由當前樹的左右區間決定的(建樹例外)
也就是m=(tree[k].l+tree[k].r)/2;
而不是m=(ll+rr)/2;
但是建樹的時候一定要按照後者寫!
3.在進行標記下傳的時候所有操作全部是+=,而不是= !
4.在判斷區間的時候必須按照
if(tree[k].l>=ll&&tree[k].r<=rr)
的格式寫,否則容易造成判斷錯誤
5.在判斷要查詢的區間的時候必須按照
if(ll<=m) interval_change(k*2,ll,rr,v);
if(rr>m) interval_change(k*2+1,ll,rr,v);
的格式寫,否則容易出錯!