線段樹的區間操作 板

2021-10-08 08:19:03 字數 1467 閱讀 1178

區間操作

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...