由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了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...