線段樹模板

2021-09-26 13:16:43 字數 1772 閱讀 3287

//線段樹模板

#include.h>

using namespace std;

#define maxn 100005

int ans=0;

//用於單點查詢輸出答案

int x;

//單點查詢的點

int y;

//單點查詢修改的值

int c;

//區間修改的值

struct nodetree[

4*maxn+1]

;//void down(int k)

void

build

(int l,

int r,

int k)

tree[k]

.l=l,tree[k]

.r=r;

int m=

(l+r)/2

;build

(l,m,

2*k)

;build

(m+1

,r,2

*k+1);

tree[k]

.w=tree[

2*k]

.w+tree[

2*k+1]

.w;}

void

ask(

int k)

// if(tree[k].f!=0) down(k); //懶標記下傳

int m=

(tree[k]

.l+tree[k]

.r)/2;

if(x<=m)

ask(k*2)

;else

ask(k*2+

1);}

void

add(

int k)

// if(tree[k].f!=0) down(k); //懶標記下傳

int m=

(tree[k]

.l+tree[k]

.r)/2;

if(x<=m)

add(k*2)

;else

add(k*2+

1); tree[k]

.w=tree[k*2]

.w+tree[k*2+

1].w;//更新修改之後線段樹所有的點

}void

sum(

int k)

// if(tree[k].f!=0) down(k); //懶標記下傳

int m=

(tree[k]

.l+tree[k]

.r)/2;

if(x<=m)

sum(

2*k);if

(y>m)

sum(

2*k+1)

;//兩個都是if

}//void change(int k)

// if(tree[k].f!=0) down(k);

// int m=(tree[k].l+tree[k].r)/2;

// if(x<=m) change(k*2);

// if(y>m) change(k*2+1);

// tree[k].w=tree[k*2].w+tree[k*2+1].w;

//}int

main()

else

if(l==2)

else

if(l==3)

else if(l==4)

else

}return0;

}

線段樹模板(模板)

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