push_down函数里的操作为什么要单独拆分出来
查看原帖
push_down函数里的操作为什么要单独拆分出来
385250
ZtoZero楼主2021/8/5 13:33

看过小花的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;
}

恳请各位大佬解惑

2021/8/5 13:33
加载中...