背景:今天心血來潮要重新碼線段樹。
但是。突然發現真是一條不歸路。
這出錯那出錯。
整了半天,發現兩個小錯誤。
下面說說為什麼重碼。
之前寫的在結構體中存了乙個節點的l和r。
就比較費空間。
再加上碼風難看和抄的題解,根本不可讀。
所以重新寫一遍。
**如下(有lazy標記)。
#include#define ll long longusing
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...