@[Stevehim](/user/759274)
1. 覆盖操作后要立即将加的标记归零,不然先赋值再加会出bug
2. 显然我可以赋值成-1e8,inf绝对值要取到1e9以上
by MarSer020 @ 2023-01-19 21:09:48
@[_MarSser020_](/user/475112) 但是我spread里面已经即使归0了a
by Stevehim @ 2023-01-19 21:50:15
@[Stevehim](/user/759274) 全局赋值再全局加就会出问题
by MarSer020 @ 2023-01-20 12:29:13
@[_MarSser020_](/user/475112) 还是有点不理解...
照着您的意思改了一下发现还是不行,您能看一下吗...?
```cpp
void spread(int p) { //下传操作
if (a[p].add2 != inf) { //检测赋值标记是否存在
// a[p].add2 += a[p].add; //加上修改标记,如果没有也没关系反正是0
a[p * 2].add2 = a[p].add2; //更新标记
a[p * 2 + 1].add2 = a[p].add2;
a[p * 2].val = (a[p * 2].r - a[p * 2 ].l + 1) * (a[p].add2 + a[p].add); //更新
a[p * 2 + 1].val = (a[p * 2 + 1].r - a[p * 2 + 1].l + 1) * (a[p].add2 + a[p].add); //更新
a[p * 2].add = a[p].add; //因为相当于同时传了俩标记,这块就放成0防止额外加
a[p * 2 + 1].add = a[p].add; //参见上方
a[p].add = 0;
a[p].add2 = inf;
} else { //没有加赋值标记
a[p * 2].val += (a[p * 2].r - a[p * 2 ].l + 1) * a[p].add;
a[p * 2 + 1].val += (a[p * 2 + 1].r - a[p * 2 + 1].l + 1) * a[p].add; //注意是添加
a[p * 2].add += a[p].add;
a[p * 2 + 1].add += a[p].add; //同样注意是添加,而不是像刚刚的直接等
a[p].add = 0;
a[p].add2 = inf;
}
}
```
by Stevehim @ 2023-01-20 14:47:32