區間操作
struct node tr[maxn<<2]
;//節點型別
void
pushup
(int m)
void
build
(int m,
int l,
int r)
//如果只有乙個節點
int mid=
(l+r)
>>1;
build
(m<<
1,l,mid)
;build
(m<<1|
1,mid+
1,r)
;//建好左右半邊
pushup
(m);
//向上更新
}void
pushdown
(int m)
}void
updata
(int m,
int l,
int r,
int val)
//正好是要更新的區間
pushdown
(m);
//向下更新
int mid=
(tr[m]
.l+tr[m]
.r)>>1;
//中間值
if(r<=mid)
updata
(m<<
1,l,r,val)
;//更新左邊區間
else
if(l>mid)
updata
(m<<1|
1,l,r,val)
;//更新右邊區間
else
pushup
(m);
//向上更新
}int
query
(int m,
int l,
int r)
//返回所求區間的sum
pushdown
(m);
//向下更新
int mid=
(tr[m]
.l+tr[m]
.r)>>1;
int temp;
if(r<=mid)
temp=
query
(m<<
1,l,r)
;//遍歷左半邊
else
if(l>mid)
temp=
query
(m<<1|
1,l,r)
;//遍歷右半邊
else
temp=
query
(m<<
1,l,mid)
+query
(m<<1|
1,mid+
1,r)
;//遍歷(l,mid),(mid+1,r)
return temp;
}
線段樹區間操作
要求單點修改,區間求和,區間取模 由於乙個數只能被取模log次,所以區間取模就變成了單點修改,同時對區間維護乙個mx值,如果mx小於模數就不取模 include define ll long long using namespace std const int maxn 100000 10 int ...
線段樹區間操作總結
昨天覆習了幾個月前自己寫下的線段樹區間操作總結的演算法筆記,雖然注釋很多,但重新再看時發現注釋仍然不夠。於是這次重新複習了線段樹區間操作演算法,已乙個初學者的角度來加上許多注釋和筆記。我將線段樹的區間操作,包括區間運算,區間求值封裝到了乙個類裡。兩種操作又包含普通版和lazy標籤版,下面是 incl...
線段樹 (區間和 單點操作)
include include include include include include include include include include define fast ios sync with stdio false define ll long long pragma gcc o...