專題 線段樹 E 區間更新,使用lazy標記

2021-08-09 11:25:28 字數 1354 閱讀 8403

#include

#include

#include

#include

using namespace std;

const int maxn=100010;

typedef long long ll;

int lazy[3*maxn];                         //懶惰標記陣列

int num[maxn];

struct node

segtree[maxn*3];

void pushdown(int root,int len)                     //len為變動區間長度

}void build(ll i,ll l,ll r)            //1 1 n

ll mid=(l+r)>>1;                //右移運算子,除以2的n次

build(i<<1,l,mid);                    //左移運算子,乘以2的n次

build((i<<1)+1,mid+1,r);

segtree[i].nsum=(ll)(segtree[i<<1].nsum+segtree[(i<<1)+1].nsum);            //父節點的值為兩子節點之和

}void pushup(int root)

//未完成由下向上的更新

void add(int i,int t,ll b,int val)                        //由上至下到達查詢點,由下向上的更新,t b為區間,val為變動值

if(segtree[i].l==segtree[i].r) return;              //到達葉節點,未進行更新

int mid=(segtree[i].l+segtree[i].r)>>1;

pushdown(i,segtree[i].r-segtree[i].l+1);            //向下更新lazy標記

if(t>mid) add((i<<1)+1,t,b,val);                        //搜尋右子樹

else if(b<=mid) add(i<<1,t,b,val);                      //搜尋左子樹

else

pushup(i);

}//查詢

/*ll query(ll i,ll l,ll r)

*/int main()

ll sum=segtree[1].nsum;

printf("case %d: the total value of the hook is ",++kase);

cout<}return 0;

}

線段樹區間更新

在此我們之前學習了線段樹的單點更新 點我 但是現在我們遇到乙個這樣的問題 給出乙個n個元素的陣列a1,a2,an。我們總共進行m次操作。每次操作為下列兩種操作其中一種 1 add l,r,v 將a l a l 1 a r 的值全部增加v。2 query l,r 計算子串行a l a l 1 a r ...

線段樹(區間更新求和)

poj 3468 include using namespace std define max 100100 struct node 求區間長度 int get dis node tree max 3 long long d max 建樹 long long build int left,int r...

線段樹之區間更新

為什麼這樣?答案是顯然的。線段樹的查詢和單點更新的時間複雜度是o logn 的,如果我每次都只是更新乙個節點,再去詢問,那麼複雜度是o nlogn 這個複雜度是可以接受的,但是如果每次操作我都是更新乙個區間,還是用單點更新去做,那麼複雜度是o n 2logn 這個複雜度是很大的,一般來說,在acm競...