把乙個陣列存成樹形結構,可以處理所有能進行區間合併的操作,單次修改和查詢為 \(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,右節點編號為...