**複雜度較高的資料結構……寫過的最長的模板(你才寫過幾個模板啊)
*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 的定義為...