線段樹模板

2022-08-01 15:45:16 字數 1668 閱讀 9011

1

#define ls l,m,rt<<1

2#define rs m+1,r,rt<<1|1

3using

namespace

std;

4const

int maxn=100005;5

int sum[maxn<<2],add[maxn<<2];//

sum求和,add懶惰標記

6int a[maxn],n;//

存原陣列資料下標[1,n]7//

更新節點資訊,這裡是求和

8void pushup(int

rt)9

12//

建樹13

void build(int l,int r,int rt)//

rt表示當前節點編號

1420

int m=(l+r)>>1

;21 build(l,m,rt<<1

);22 build(m+1,r,rt<<1|1

);23

pushup(rt);24}

2526

//點修改a[l]+=c;

27void update(int l,int c,int l,int r,int

rt)28

34int m=(l+r)>>1;35

//根據條件判斷呼叫左子樹還是右子樹

36if(l<=m)

37 update(l,c,l,m,rt<<1

);38

else

39 update(l,c,m+1,r,rt<<1|1

);40 pushup(rt);//

子節點更新,所以本節點也需要更新41}

4243

//區間修改a[r,t]+=c

44void update_(int l,int r,int c,int l,int r,int

rt)45

52int m=(l+r)>>1

;53 pushdown(rt,m-l+1,r-m);

54if(l<=m)

55 update_(l,r,c,l,m,rt<<1

);56

if(r>m)

57 update_(l,r,c,m+1,r,rt<<1|1

);58

pushup(rt);59}

60//

區間查詢 a[l,r]的和

61//

下推標記函式

62void pushdown(int rt,int ln,int

rn)63 72}

73int query(int l,int r,int l,int r,int

rt)74

79int m=(l+r)>>1

;80 pushdown(rt,m-l+1,r-m);

81int ans=0;82

if(l<=m)

83 ans+=query(l,r,l,m,rt<<1

);84

if(r>m)

85 ans+=query(l,r,m+1,r,rt<<1|1

);86

return

ans;

87 }

理解參考:

線段樹模板(模板)

參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img xhrgdjcd 1613976863463 區間儲存在陣列中的下標對應為 12 3 4 5 6 7 8 9 10 11 12 13 14 15 四部分單點更新 根據題目的要求編寫自己的pushup,query...

線段樹模板

include include include using namespace std const int size 10010 struct node the node of line tree class linetree void updatem void updateline public ...

線段樹模板

單點更新,區間求最值 include include include include include define n 222222 using namespace std int num n struct tree tree n 4 void push up int root void build...