線段樹模板

2021-10-18 02:26:54 字數 1048 閱讀 7863

線段樹是把乙個線段分塊,利用分塊的思想降低時間複雜度。我感覺是用空間換時間的一種做法。根據維護的資訊不同,線段樹實現的功能也不同。有區間加,區間乘,區間求最小最大值,區間求和等功能,十分強大的乙個資料結構。主要是利用二分的思想去實現,把乙個長度為n的線段,先前後分為0-n/2,n/2-n,然後遞迴地建樹,最終得到一顆完美二叉樹。

目前,下列**是實現洛谷3372線段樹1(區間和)的線段樹

#include#include#define maxn 1000001

using namespace std;

typedef long long ll;

long long n,m,a[maxn],ans[maxn<<2],tag[maxn<<2];

ll ls(ll p)

ll rs(ll p)

void push_up_sum(ll p)

void build(ll p,ll l,ll r)

ll mid=(l+r)>>1;

build(ls(p),l,mid);

build(rs(p),mid+1,r);

push_up_sum(p);

}void f(ll p,ll l,ll r,ll k)

void push_down(ll p,ll l,ll r)

void update(ll nl,ll nr,ll l,ll r,ll p,ll k)

push_down(p,l,r);

ll mid=(l+r)>>1;

if(nl<=mid) update(nl,nr,l,mid,ls(p),k);

if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);

push_up_sum(p);

}ll query(ll qx,ll qy,ll l,ll r,ll p)

int main()

ll num,l,r,k;

build(1,1,n);

while(m--)

else

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