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