看过小花的Senior Data Structure · 浅谈线段树(Segment Tree)题解
对
“//我们可以认识到,f函数的唯一目的,就是记录当前节点所代表的区间 ”
这句话不太理解
对于:
ll lazy[mx<<2];
void f(ll num, ll l, ll r, ll delta){
lazy[num] += delta;
tree[num] += delta*(r-l+1);
}
void push_down(ll num, ll l, ll r){
ll m = (l+r)>>1;
f(num<<1,l,m,lazy[num]);
f(num<<1|1,m+1,r,lazy[num]);
lazy[num] = 0;
return;
}
为何要将f()从push_down()里拆分出来
试过不拆分但惨烈WA*9
ll lazy[mx<<2];
void push_down(ll num, ll l, ll r){
ll m = (l+r)>>1;
lazy[num<<1] += lazy[num];
tree[num<<1] += lazy[num]*(m-l+1);
lazy[num<<1|1] += lazy[num];
lazy[num<<1|1] += lazy[num]*(r-m);
lazy[num] = 0;
return;
}
恳请各位大佬解惑