學習筆記 線段樹系列

2022-09-20 22:42:17 字數 1711 閱讀 1428

把乙個陣列存成樹形結構,可以處理所有能進行區間合併的操作,單次修改和查詢為 \(o(\log n)\)。

學會使用懶標記,放個板子。

支援單點和區間的加法與乘法,單點查詢和區間查詢最值與求和。

int n,q;

ll a[maxn];

struct segmenttree

inline void push_down(int rt,int l,int r)

inline void build(int rt,int l,int r)

build(lson); build(rson);

addlaz[rt]=0,mullaz[rt]=1;

push_up(rt);

} inline void update_add_x(int rt,int l,int r,int p,ll k)

push_down(rt,l,r);

if(p<=mid) update_add_x(lson,p,k);

else update_add_x(rson,p,k);

push_up(rt);

} inline void update_add_lr(int rt,int l,int r,int pl,int pr,ll k)

push_down(rt,l,r);

if(pl<=mid) update_add_lr(lson,pl,pr,k);

if(pr>mid) update_add_lr(rson,pl,pr,k);

push_up(rt);

} inline void update_mul_x(int rt,int l,int r,int p,ll k)

push_down(rt,l,r);

if(p<=mid) update_mul_x(lson,p,k);

else update_mul_x(rson,p,k);

push_up(rt);

} inline void update_mul_lr(int rt,int l,int r,int pl,int pr,ll k)

push_down(rt,l,r);

if(pl<=mid) update_mul_lr(lson,pl,pr,k);

if(pr>mid) update_mul_lr(rson,pl,pr,k);

push_up(rt);

} inline ll query_val_x(int rt,int l,int r,int p)

inline ll query_max_lr(int rt,int l,int r,int pl,int pr)

inline ll query_min_lr(int rt,int l,int r,int pl,int pr)

inline ll query_sum_lr(int rt,int l,int r,int pl,int pr)

}sgt;

int main()

sgt.build(1,1,n);

while(q--)

else if(ope==2)

else if(ope==3)

else if(ope==4)

else if(ope==5)

else if(ope==6)

else if(ope==7)

else if(ope==8)

} return 0;

}

樹鏈剖分學習筆記

線段樹學習筆記

線段樹是一種 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 而未優化的 空間複雜度 為2n,因此有時需要離散化讓空間壓縮。以下筆記摘自lcomyn神犇部落格 1....

線段樹學習筆記

本文筆記在參考一步一步理解線段樹 tenos的基礎上形成 線段樹,也是二叉搜尋樹的一種,是基於陣列,但是優於陣列的一種資料結構。同時結合預處理 時間複雜度一般在o n 使得從原來陣列的o n 的查詢和更新複雜度降到了o logn 在處理很大資料量的資料更新和查詢最值方面變得簡單,值得一提的是,它的構...

線段樹學習筆記

線段樹是一種維護區間的資料結構,且滿足二叉樹的全部性質 下圖是一棵維護區間 1 6 1,6 的線段樹 格式 idl ri dl r我們可以發現,對於每個節點 k k 來說,其左節點編號為2k role presentation style position relative 2k2 k,右節點編號為...