重碼資料結構 線段樹1

2022-05-12 12:10:21 字數 1372 閱讀 6356

背景:今天心血來潮要重新碼線段樹。

但是。突然發現真是一條不歸路。

這出錯那出錯。

整了半天,發現兩個小錯誤。

下面說說為什麼重碼。

之前寫的在結構體中存了乙個節點的l和r。

就比較費空間。

再加上碼風難看和抄的題解,根本不可讀。

所以重新寫一遍。

**如下(有lazy標記)。

#include#define ll long long

using

namespace

std;

const

int maxn=100001

;struct

treet[maxn

<<2

];ll a[maxn];

intn,m;

void build(int p,int l,int

r)

int mid=(l+r)>>1

; build(p

<<1

,l,mid);

build(p

<<1|1,mid+1

,r);

t[p].sum=t[p<<1|1].sum+t[p<<1

].sum;

}inline

void pushdown(int p,int l,int

r)inline

void ad(int p,int l,int r,int x,int y,int

d) pushdown(p,l,r);

int mid=(l+r)>>1

;

if(x<=mid) ad(p<<1

,l,mid,x,y,d);

if(y>mid) ad(p<<1|1,mid+1

,r,x,y,d);

t[p].sum=t[p<<1].sum+t[p<<1|1

].sum;

}inline ll ask(

int p,int l,int r,int x,int

y) pushdown(p,l,r);

ll ans=0

;

int mid=(l+r)>>1

;

if(x<=mid) ans+=ask(p<<1

,l,mid,x,y);

if(y>mid) ans+=ask(p<<1|1,mid+1

,r,x,y);

return

ans;

}int

main()

else

}//system("pause");

return0;

}

例題就是線段樹1,luogu_p3372:

資料結構之 線段樹 1

線段樹是acm中比較常見的資料結構,它的每一點都代表了一條線段 a,b 長度為1的為元線段,所有葉子結點的長度均為1。長度範圍為 1,l 的一顆線段樹的深度為log l 1 1。線段樹基本的應用時查詢某段的和,最大最小值,成段更新,保證每次操作的複雜度為log n 關於線段樹的文章有很多,大家可以參...

資料結構 線段樹

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

資料結構 線段樹

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