模板 線段樹

2022-09-17 20:30:19 字數 1691 閱讀 9810

目錄上週講的線段樹專題,沒有太跟上,自己又把線段樹的模板先敲了幾遍,又增加了些許改進,用此部落格以儲存。

#include #include #include #define n 200000

using namespace std;

//@start: 2020-03-17 21:43:16

//@end: 2020-03-19 22:22:10

/** * 線段樹模板v2.0

* 更新要點:

* 1. **簡約化

* 2. 增加**注釋的詳細度

* 3. 增加較為完備的函式引數注釋

**/int num[n]; //存放資料

int t[n<<2]; //線段樹

int lazy[n<<2]; //懶陣列,用於區間更新

/*引數說明:

t:要更新的根節點

*/void push_up(int t)

/*引數說明:

t:要更新的根節點

d:根節點所管轄的區間長度,r-l+1

*/void push_down(int t,int d)}/*

引數說明:

l,r:建樹左右邊界

t:建樹根節點

*/void build(int l,int r,int t)

int mid=(l+r)>>1;//取中值

build(l,mid,t<<1);//左子樹

build(mid+1,r,t<<1|1);//右子樹

push_up(t);//建完向上更新

return ;}/*

引數說明:

p,v:要更新的位置,更新的值

l,r:根節點左右邊界

t:根節點

*/void update(int p,int v,int l,int r,int t)

int mid=(l+r)>>1;//取中值

//沒找到葉子節點

if(p<=mid)//該點在左子區間

update(p,v,l,mid,t<<1);

else //該點在右子區間

update(p,v,mid+1,r,t<<1|1);

push_up(t);//找完需要向上更新}/*

引數說明:

l,r:待更新區間

l,r:根節點左右邊界

t:根節點

*/void update_**(int l,int r,int v,int l,int r,int t)

push_down(t,d);//在查詢之前向下更新

int mid=(l+r)>>1;//取中值

if(r<=mid)//更新區間完全在左子區間內

update_**(l,r,v,l,mid,t<<1);

else if(l>mid)//更新區間完全在右子區間內

update_**(l,r,v,mid+1,r,t<<1|1);

else//更新區間橫跨左右子區間

push_up(t);

return ;}/*

引數說明:

l,r:待查詢區間

l,r:根節點左右邊界

t:根節點

*/int query(int l,int r,int l,int r,int t)

int main()

線段樹模板(模板)

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