模板 線段樹(區間加)

2022-05-19 22:17:08 字數 1366 閱讀 1719

**複雜度較高的資料結構……寫過的最長的模板(你才寫過幾個模板啊)

*2021.9.24 redt: **編寫複雜度並不高,我錯了()

這麼個東西:

線段樹是棵平衡二叉樹qwq 所以我們可以用\(i*2\)與\(i*2+1\)分別表示\(i\)的左兒子和右兒子

有點類似分塊的思想 or 樹狀陣列……???也是拆分拆分拆分求和求和求和

設定add的標記,省去乙個個節點修改的很多時間

在修改&查詢中不斷維護父子關係

#include #include #include #include #define ll long long

#define maxn 1000001

#define leftson cur<<1

#define rightson cur<<1|1

#define mid ((l+r)>>1)

#define push_up ans[cur]=ans[leftson]+ans[rightson]

#define push_down lazyadd(leftson,l,mid,tag[cur]); lazyadd(rightson,mid+1,r,tag[cur]); tag[cur]=0

using namespace std;

ll ans[maxn<<2],tag[maxn<<2];

void build(ll cur,ll l,ll r)

build(leftson,l,mid);

build(rightson,mid+1,r);

push_up;

}inline void lazyadd(ll cur,ll l,ll r,ll delta)

inline void change(ll adl,ll adr,ll cur,ll l,ll r,ll delta)

push_down;

if (adl<=mid) change(adl,adr,leftson,l,mid,delta);

if (adr>mid) change(adl,adr,rightson,mid+1,r,delta);

push_up;

}long long query(ll quel,ll quer,ll cur,ll l,ll r)

push_down;

ll answer=0;

if (quel<=mid)

if (quer>mid)

return answer;

}int main()

scanf("%lld%lld",&a,&b);

printf("%lld\n",query(a,b,1,1,n));

}return 0;

}

線段樹模板 區間加

注意查詢和區間加的函式 查詢函式中 兩個if判斷 else的語句是為了判斷區間在中間值的一邊還是分別在兩邊,所以用else 而區間加的函式中 則是先用若當前的這個區間是否在mid左邊有,和是否在mid右邊也有 如果只有其中乙個就遞迴乙個函式 如果兩個都有則都要遞迴 所以不需要else include...

線段樹 區間加乘區間最大

如題,已知乙個數列,你需要進行下面兩種操作 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 的定義為...