(線段樹)模板

2021-08-07 05:16:00 字數 1972 閱讀 6319

支援的操作有:

區間最大最小值

區間和

# include 

# include

#define maxn 100007 //元素總個數

#define ls l,m,rt<<1

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

using namespace std;

typedef struct shu

shu;

shu xianduan[10000];

int sum[maxn<<2],add[maxn<<2];//sum求和,add為懶惰標記

int a[maxn],n;//存原陣列資料下標[1,n]

//pushup函式更新節點資訊 ,這裡是求和

void pushup(int rt)

//build函式建樹

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

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

//左右遞迴

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

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

//更新資訊

pushup(rt);

}//單點更新

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

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

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

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

else update(l,c,m+1,r,rt<<1|1);

pushup(rt);//子節點更新了,所以本節點也需要更新資訊

}//延遲標誌

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

}//區間更新

void update1(int l,int r,int c,int l,int r,int rt)

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

pushdown(rt,m-l+1,r-m);//下推標記

//這裡判斷左右子樹跟[l,r]有無交集,有交集才遞迴

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

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

pushup(rt);//更新本節點資訊

}//求區間和

int query(int l,int r,int l,int r,int rt)

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

//下推標記,否則sum可能不正確

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

//累計答案

int ans=0;

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

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

return ans;

}//求區間最小值

int qmin(int l,int r,int l,int r,int rt)

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

//下推標記,否則sum可能不正確

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

//累計答案

return min(query(l,r,l,m,rt<<1),query(l,r,m+1,r,rt<<1|1));

}//求區間最大值

int qmax(int l,int r,int l,int r,int rt)

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

//下推標記,否則sum可能不正確

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

//累計答案

return max(query(l,r,l,m,rt<<1),query(l,r,m+1,r,rt<<1|1));

}int main(void)

線段樹模板(模板)

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