線段樹 區間更新 模版

2021-07-04 12:39:17 字數 1168 閱讀 1106

#include 

#include"cstdio"

#include"string.h"

using namespace std;

const

int n= 100005;

struct node

tree[n*4];

int n,m;

int a[n];

void init()

//將下面更新的值返回上一層

void pushup(int

id)//將標記區間向下移動

void pushdown(int

id)//建樹的時候每次建完下一層要向上層賦值

void build(int

id,int l,int r)

int mid=(l+r)/2;

build(id*2,l,mid);

build(id*2+1,mid+1,r);

pushup(id);

}void add(int

id,int l,int r,int val)

//如果當前區間沒有被包含

if(tree[id].right

id].left>r) return ;

//如果當前區間部分被包含,標記下移

if(tree[id].add) pushdown(id);

//更新左右子區間

add(id*2,l,r,val);

add(id*2+1,l,r,val);

//更新完再把結果返回上層

pushup(id);

}int ans;

void query(int

id,int l,int r)

//查詢部分該區間,標記下移

if(tree[id].add) pushdown(id);

//左右查詢

int mid=(tree[id].left+tree[id].right)/2;

if(l<=mid) query(id*2,l,r);

if(r>mid) query(id*2+1,l,r);

}int main()

if(s[0]=='c')}}

//fclose(stdin);

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