線段樹模板

2022-08-13 14:18:12 字數 1684 閱讀 7386

1 #include2

3#define maxn 100007

4using

namespace

std;56

int sum[maxn<<2],lazy[maxn<<2];7

inta[maxn],n;89

void pushup(int rt)//

更新節點資訊

10//

建樹11

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

l,r當前節點區間,rt當前節點編號;

1218

19int m=(l+r)>>1;20

21 build(l,m,rt<<1

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

);23

24pushup(rt);25}

2627

//下推懶標記

28void pushdown(int rt,int ln,int rn)//

ln rn 左子樹右子樹數字數量

2940}41

42//

更新節點

43void update(int l,int c,int l,int r,int rt)//

a[l]=c

4450

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

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

5354

if(l<=m)update(l,c,l,m,rt<<1

);55

else

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

);57

58pushup(rt);59}

6061

//更新區間

62void update(int l,int r,int c,int l,int r,int rt)//

l,r操作區間 l,r當前區間rt節點

6370

int m=(l+r)>>1

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

7273

if(l<=m)update(l,r,c,l,m,rt<<1

);74

if(r>m)update(l,r,c,m+1,r,rt<<1|1

);75

pushup(rt);76}

77//

查詢區間

78int query(int l,int r,int l,int r,int

rt)79

8485

int m=(l+r)>>1

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

8788

int ans=0;89

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

);90

if(r>m)ans+=query(l,r,m+1,r,rt<<1|1

);91

return

ans;92}

9394

95//

函式呼叫

96 build(1,n,1

);97 update(l,c,1,n,1

);98 update(l,r,c,1,n,1

);99

int ans=query(l,r,1,n,1);

線段樹模板(模板)

參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 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...