資料結構 線段樹的幾種用法

2022-05-05 20:42:10 字數 2193 閱讀 9528

運用lazy-tag(懶標記)的維護方法

例題:

洛谷p3372:

**:

#include#include

#include

using

namespace

std;

#define maxn 100007

#define ll long longll sum[maxn

<<2],add[maxn<<2

],a[maxn],n,m;

void build(ll l,ll r,ll k)//

建樹 [l,r]中 編號為k的區間

ll mid=(l+r)>>1

; build(l,mid,k

<<1);//

左子樹

build(mid+1,r,k<<1|1);//

右子樹

sum[k]=sum[k<<1]+sum[k<<1|1];//

更新區間和

}void add(ll l,ll r,ll v,ll k)//

給定區間[l,r]中所有的數加上v

void pushdown(ll l,ll r,ll mid,ll k)//

標記下傳

void update(ll x,ll y,ll v,ll l,ll r,ll k)//

更新定區間[x,y]中 區間[l,r]第k個區間

ll query(ll x,ll y,ll l,ll r,ll k)

//查詢定區間[x,y]中 區間[l,r]第k個區間

intmain()

else

}}

例題:

洛谷p3373:

**:

#include#include

#include

using

namespace

std;

#define maxn 100007

#define ll long longll sum[maxn

<<2],add[maxn<<2],mul[maxn<<2

],a[maxn],n,m,p;

void

build(ll l,ll r,ll k)

ll mid=(l+r)>>1

; build(l,mid,k

<<1);//

左右子樹構建

build(mid+1,r,k<<1|1

); sum[k]=(sum[k<<1]+sum[k<<1|1])%p;//

維護sum值

}void pushdown(ll l,ll r,ll mid,ll k)//

標記下放

if(add[k])//

當有加法標記

return;}

void update1(ll x,ll y,ll v,ll l,ll r,ll k)//

在定區間[x,y]加上v

ll mid=(l+r)>>1

; pushdown(l,r,mid,k);

if(x<=mid) update1(x,y,v,l,mid,k<<1

);

if(mid1,r,k<<1|1

); sum[k]=(sum[k<<1]+sum[k<<1|1])%p;//

計算標記下放之後的值

return;}

void update2(ll x,ll y,ll v,ll l,ll r,ll k)//

在定區間[x,y]乘上v

ll mid=(l+r)>>1

; pushdown(l,r,mid,k);

if(x<=mid) update2(x,y,v,l,mid,k<<1

);

if(mid1,r,k<<1|1

); sum[k]=(sum[k<<1]+sum[k<<1|1])%p;//

計算標記下放之後的值

return;}

ll query(ll x,ll y,ll l,ll r,ll k)

intmain()

else

if(x==2

)

else

if(x==3

)

}}

資料結構 線段樹

啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...

資料結構 線段樹

一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...

資料結構 線段樹

線段樹是一顆平衡的二叉搜尋樹,他以空間換區時間,讓線性查詢加速log級別的查詢,用到的演算法主要是二分搜尋和遞迴。例如 有陣列data 我有乙個需求,我需要頻繁的查詢區間i j的sum和。這裡先給出兩個解決方案 如果使用最普通的演算法遍歷,那麼查詢和更新的複雜度為o n 當然你還可以使用動態規劃,定...