一些可以在线段树上维护的信息和修改

信息

最基础的信息之一:区间和

\(sum = l.sum + r.sum\)

最基础的信息之一:区间大小

\(sz = l.sz + r.sz\)

最基础的信息之一:区间最值

\(minv = min(l.minv, r.minv)\)

普通信息:最值个数

if (l.minv < r.minv) minvcnt = l.minvcnt;
else if (r.minv < l.minv) minvcnt = r.minvcnt;
else minvcnt = l.minvcnt + r.minvcnt; // 左侧,右侧,越过分治线

普通信息:最大前缀和 maximum presegment sum

mxpresum = max(l.mxpresum, l.sum + r.mxpresum);

稍复杂信息:最大子段和 maximum subsegment sum

mxss = max({l.mxss, r.mxss, l.mxsufsum + r.mxpresum}); // 左侧,右侧,越过分治线

修改

区间加值

i.sum = i.sum + i.sz * add;
i.add = i.add + add;

区间赋值

维护 \(sum \times mul + add\)
可以同时维护区间乘 \((mul, 0)\)、加 \((1, add)\) 、赋值 \((0, add)\)
标记利用 \((x \times mul_1 + add_1) \times mul_2 + add_2 = x \times mul_1 \times mul_2 + add_1 \times mul_2 + add_2\) 维护。

i.sum = i.sum * mul + add;
i.mul = i.mul * mul;
i.add = i.add * mul + add;

区间整除/开方

利用势能

posted @ 2024-07-13 22:49  zsxuan  阅读(8)  评论(0编辑  收藏  举报