線段樹模板新

2022-03-11 13:58:56 字數 2106 閱讀 1300

直接先上**,然後來個例題

#includeusing

namespace

std;

void pushup(int

rt);

int init(int

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

rt)

int mid=(l+r)>>1

; build(l,mid,rt

<<1

); build(mid,r,rt

<<1|1

); pushup(rt);

}void pushdown(int

rt)}

void update(int l,int r,int l,int r,int

rt)

int mid=(l+r)>>1

; pushdown(rt);

if (l1

);

if (r>mid) update(l,r,c,mid,r,rt<<1|1

); pushup(rt);}//

更新pushup pushdown都需要

void update(int v,int rt)//

rt為陣列中位置+n-1

}//單點修改

int query(int l,int r,int l,int r,int

rt)

int mid=(l+r)>>1

; pushdown(rt);

//若更新只有點更新,不需要這句

int ans=0

if (l1

);

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

);

return

ans;}//

查詢只需要pushdown

//建樹得把n變成2的冪

洛谷p3372

#includeusing

namespace

std;

typedef

long

long

ll;const

int inf=1

<<30

;const

int maxn=1e5+7

;const

double pi=acos(-1

);const

int mod=100

;#define meminf(a) memset(a,0x3f,sizeof(a))

#define mem0(a) memset(a,0,sizeof(a))

#define ls rt<<1

#define rs rt<<1|1

#define mid (l+r)>>1ll dat[maxn

<<2],lazy[maxn<<2],a[maxn<<2

];void pushup(int

rt)void pushdown(int rt,int l,intr)}

void build(int l,int r,int

rt) build(l,mid,ls);

build(mid,r,rs);

pushup(rt);

}void update(int l,int r,int s,int t,int

rt,ll c)

pushdown(rt,l,r);

//遞迴到子節點前先標記下傳

if(sif(t>mid) update(mid,r,s,t,rs,c);

pushup(rt);

}ll query(

int l,int r,int s,int t,int

rt) pushdown(rt,l,r);

if(squery(l,mid,s,t,ls);

if(t>mid) ans+=query(mid,r,s,t,rs);

return

ans;

}int

main()

else

if(opt==2

) }

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...