總結了一下線段樹的基本運用和操作,也方便日後知識的梳理和ctrl c+v提高ac率
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define n 100//n是題目給的最大區間,而節點數要開4倍,確切的來說節點數要開大於maxn的最小2x的兩倍
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int sum[n*2];
int n;
int col[n<<2]
inline void pushup(int rt)//從其子節點更新當前節點
inline void build(int l,int r,int rt)//建樹
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
} inline int query(int l,int r,int l,int r,int rt)//求區間[l,r]的和 ,也可以查詢區間最值
inline void update(int p,int add,int l,int r,int rt)//單點增減或改變
int m=(l+r)>>1;
if(p<=m)update(p,add,lson);
else update(p,add,rson);
pushup(rt);//因為更新了子節點,自然要維護,所以父節點也要變
} inline void pushdown(int rt,int m)//延遲更新 ,其實本質上不過是只更新父節點,然後有需要才更新子節點
}void update(int l,int r,int c,int l,int r,int rt) //整個區間[l,r]增減c或者改變為c
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if (l<=m) update(l,r,c,lson);
if (r>m) update(l,r,c,rson);
pushup(rt);
} inline int query(int l,int r,int l,int r,int rt) //延遲標記時的區間求和,其實就是多了個處理標記的~~~
{ if (l<=l&&r>=r) return sum[rt];
pushdown(rt,r-l+1);
int m=(l+r)>>1;
int ret=0;
if(l<=m)ret+=query(l,r,lson);
if(m
線段樹模板(模板)
參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 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...