線段樹模板 區間加

2021-09-29 15:39:28 字數 1357 閱讀 5646

注意查詢和區間加的函式

查詢函式中

兩個if判斷+else的語句是為了判斷區間在中間值的一邊還是分別在兩邊,所以用else

而區間加的函式中

則是先用若當前的這個區間是否在mid左邊有,和是否在mid右邊也有

如果只有其中乙個就遞迴乙個函式

如果兩個都有則都要遞迴

所以不需要else

#include

#include

#define ll long long

using

namespace std;

struct czp

a[400004];

int n,m;

intread()

while

(ch>=

'0'&& ch<=

'9')

return x*f;

}void

build

(int i,

int l,

int r)

int mid=

(l+r)

>>1;

build

(i*2

,l,mid)

;build

(i*2+1

,mid+

1,r)

; a[i]

.sum=a[i*2]

.sum+a[i*2+

1].sum;

}//建樹操作

voidup(

int i,ll v)

//懶標記操作

void

down

(int i)

//進行下放懶標記操作

void

add(

int i,

int l,

int r,ll v)

//如果要查詢的區間包含在了當前區間裡,則直接加並且標記懶標記

down

(i);

int mid=

(a[i]

.l+a[i]

.r)>>1;

if(l<=mid)

add(i*

2,l,r,v);if

(r>mid)

add(i*2+

1,l,r,v)

; a[i]

.sum=a[i*2]

.sum+a[i*2+

1].sum;

}ll pd

(int i,

int l,

int r)

intmain()

else

}return0;

}

模板 線段樹(區間加)

複雜度較高的資料結構 寫過的最長的模板 你才寫過幾個模板啊 2021.9.24 redt 編寫複雜度並不高,我錯了 這麼個東西 線段樹是棵平衡二叉樹qwq 所以我們可以用 i 2 與 i 2 1 分別表示 i 的左兒子和右兒子 有點類似分塊的思想 or 樹狀陣列 也是拆分拆分拆分求和求和求和 設定a...

線段樹 區間加乘區間最大

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.將某區間每乙個數乘上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...

線段樹區間修改模板

本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。可也不能再拖了,在做題中也許有更多的體會。模板一 1 l r v 表示區間 l,r 所有元素都加上v 2 l r 表示查詢區間 l,r 的sum,min,max sumv o 的定義為...