線段樹 區間求和模板 (區間修改)

2021-08-07 14:29:17 字數 1347 閱讀 5038

#include 

#include

#include

#include

#include

#include

#include

#include

#include

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

#define mem2(a) memset(a,-1,sizeof(a))

#define mod 1000000007

#define mx 100005

using

namespace

std;

long

long a[mx],sum[mx<<2],add[mx<<2];//直接開long long 就好了。sum和add陣列要開資料量的四倍別忘了。

int n,l;

void pushup (int x)//維護當前線段的區間和。

void build (int l,int r,int x)//建樹

int mid = (l+r)/2;

build(l,mid,x<<1);

build(mid+1,r,x<<1|1);

pushup(x);

}void pushdown (int x,int lx,int rx)//下推懶惰標記。

}void update (int l,int r,int c,int l,int r,int x)

int mid=(l+r)/2;

pushdown(x,mid-l+1,r-mid);

//一定要在向下更新操作進行之前下推懶惰標記。

if(l<=mid) update(l,r,c,l,mid,x<<1);

if(r>mid) update(l,r,c,mid+1,r,x<<1|1);

pushup(x);

}long

long query (int l,int r,int l,int r,int x)//返回值一定要寫long long 別問我怎麼知道的。

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

pushdown(x,mid-l+1,r-mid);

//下推懶惰標記,更新左子樹和右子樹維護的線段的區間和的值。

long

long ans=0;

if(l<=mid) ans+=query(l,r,l,mid,x<<1);

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

return ans;

}int main()}}

return

0;}

線段樹區間修改模板

本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。可也不能再拖了,在做題中也許有更多的體會。模板一 1 l r v 表示區間 l,r 所有元素都加上v 2 l r 表示查詢區間 l,r 的sum,min,max sumv o 的定義為...

模板 線段樹(區間修改)

1 include 2 include 3 include 4 include 5 include 6 using namespace std 7const int maxn 100000 10 8 9 update a dd 把a l a r 的值全部加v add 10 update s et 把...

模板 線段樹 區間修改

與上篇線段樹一起食用效果更佳 神奇線段樹 點選收穫幸福 一開始當然是暴力!會超時的否掉 不用暴力的話。就用 結合 了解吧。我不想畫圖。先建樹 建樹 void build tree int x,int y,int p int mid x y 2 build tree x,mid,p 2 build t...