注意查詢和區間加的函式
查詢函式中
兩個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 的定義為...