運用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 當然你還可以使用動態規劃,定...