線段樹模板

2021-06-29 08:59:53 字數 1613 閱讀 7205

下面的兩份線段樹模板,乙份是單點更新維護區間最小值,乙份是區間更新,同時維護區間和,區間最大最小值。

**如下:

///線段樹單點更新

#include

#include

#include

#include

using namespace std;

#define maxn 1000

#define inf 0x3f3f3f3f

int a[maxn];

int minv[maxn*4]; ///線段樹標記陣列

///線段樹建構函式

///然後記錄一下資訊(形參表示編號為o的線段樹節點對應的線段是l--r)

void build(int o,int l,int r)

}///單點更新 更新a[p]的值為v

///然後再遞迴向上更新

void update(int o,int l,int r,int p,int v)

}///區間查詢 查詢區間ql,qr之間的最小值

int query(int o,int l,int r,int ql,int qr)

int main()

return

0;}

///線段樹區間更新加維護 區間最大值 最小值 區間和

#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define maxn 1000

int a[maxn],sum[maxn*4],minv[maxn*4];

///每個節點都會被附加乙個lazy標記

intlazy[maxn*4],maxv[maxn*4];

///更新子節點後維護父節點資訊

void maintain(int o,int l,int r)

///遞迴查詢或者修改時向下傳遞資訊

void pushdown(int o,int l,int r)

}void build(int o,int l,int r)

else

}void update(int o,int l,int r,int ql,int qr,int add)

pushdown(o,l,r);

if(ql<=m)

update(o*2,l,m,ql,qr,add);

if(qr>m)

update(2*o+1,m+1,r,ql,qr,add);

maintain(o,l,r);

}///定義全域性變數用來記錄當前區間查詢的結果

int _max,_min,_sum;

void query(int o,int l,int r,int ql,int qr)

pushdown(o,l,r);

if(ql<=m)

query(2*o,l,m,ql,qr);

if(qr>m)

query(2*o+1,m+1,r,ql,qr);

}void init()

void print(int x,int y)

return

0;}

線段樹模板(模板)

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