前置知识:
简要题意:
维护数组的区间加,乘,区间和。
首先,如果没有乘的话,直接把 P3372 【模板】线段树1 的代码复制过来进行了。
那么,你会说:
- 那多简单,用两个标记,然后加的时候改加,乘的时候改乘。
真的是这样的吗?是还用我跟你讲啊
不是。
比方说,一个区间原来的和是 a a a.假设给它依次打上 + 2 +2 +2, × 3 \times 3 ×3, + 4 +4 +4, × 5 \times 5 ×5 的标记,并用 mul \text{mul} mul 表示乘法标记(初始为 1 1 1), add \text{add} add 表示 加法标记(初始为 0 0 0).
那么,按照你说的,应该是:
-
+ 2 +2 +2,则 add=2,mul=1 \text{add=2,mul=1} add=2,mul=1.
-
× 3 \times 3 ×3,则 add=2,mul=3 \text{add=2,mul=3} add=2,mul=3.
好了,这里就已经错了。你 × 3 \times 3 ×3 的时候,其实结果应该是:
( a + 2 ) × 3 = 3 a + 6 (a+2) \times 3 = 3a + 6 (a+2)×3=3a+6,所以你的加法标记 碰到加法是累加,碰到乘法是累乘!
那么,计算优先级呢?当然是先乘法啦。
因为,如果 a × 3 + 2 a \times 3 + 2 a×3+2 的话,你先算加