POJ 3468 線段樹區間修改,區間求和

2022-05-19 03:33:50 字數 1759 閱讀 9007

由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree[root].val=tree[l(root)].val+tree[r(root)].val;

但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打上懶標記即可。如果以後update 或者 query 需要跑到下面,直接往下pushdown即可。

pushdown的時候,由於當前層的資訊已經更新,我們需要把資訊往下推,並把子節點的資訊維護,因此需要把laze標記往下打,並且往下更新修改即可

#include#include

#include

#include

using

namespace

std;

const

int maxn = 100003

;long

long

sum;

inline

int l(int

r)inline

int r(int

r)inline

int mid(int l,int

r)struct

node

tree[maxn

<<2

];long

long

b[maxn];

void pushdown(int

root)

}void buildtree(int root,int l,int

r)

int mid=mid(l,r);

buildtree(l(root),l,mid);

buildtree(r(root),mid+1

,r);

tree[root].val=tree[l(root)].val+tree[r(root)].val;

}void update(int root,int l,int r,long

long

v) pushdown(root);

if(tree[root].left==tree[root].right)

int mid=mid(tree[root].left,tree[root].right);

if(l>mid)

update(r(root),l,r,v);

//左區區間僅僅在右兒子節點中

else

if (r<=mid)update(l(root),l,r,v);//

僅僅在左兒子節點中

else

tree[root].val=tree[l(root)].val+tree[r(root)].val;//

把更新往上修改

}void query(int root,int l,int

r) pushdown(root);

if(tree[root].left==tree[root].right)return

;

int mid=mid(tree[root].left,tree[root].right);

if (l>mid)query(r(root),l,r);

else

if (r<=mid)query(l(root),l,r);

else

}int

main()

buildtree(

1,1,n);

while(m--)

else}}

return0;

}

poj3468線段樹區間修改

題目哈。最近在隊裡的寒假作業中第一次遇到了線段樹的題,之前也聽思雨姐姐說過也看過她寫過,但自己始終沒個影響,然後自己做了幾天也算剛入這個門,會寫一些比較基礎的線段樹了,之所以把這道題寫下來是因為線段樹的精華還是在於區間修改,也是最實用的部分。線段樹的區間修改,最巧妙的部分是建立乙個lazy樹,與各個...

POJ 3468 線段樹區間

這個題目是第二個區間修改的線段樹了,做到現在可以發現線段樹真的非常的靈活,特別是區間修改部分,前面的單點修改其實還是也可參看模版的,區間修改就真的非常靈活了了。這個題目就是區間加法,然後求乙個累加和,同樣地也是需要乙個延遲標誌的,也就是lazy,然後還需要乙個統計當前區間的全部和的陣列。就可以輕鬆解...

poj 3468 樹狀陣列 區間修改 區間求和

這是利用樹狀陣列進行 區間求和區間修改,寫起來比線段樹輕鬆許多,具體的原理參考大佬部落格 如下 1 2 poj 3468 樹狀陣列 區間修改 和 區間查詢 3原理 4c1 和 c2 是兩個差分陣列,所以輸入資料時 c1 i a i a i 1 56 7 include 8 include 9 inc...