P3373 【模板】线段树 2 题解

本文探讨线段树如何处理区间加法和乘法操作,指出在维护区间和时,加法和乘法标记需要正确处理,尤其是乘法标记遇到加法时应累乘。线段树在没有询问时可以不下传标记,询问时再更新,解决了区间操作的高效维护问题。文章通过对话形式解释了线段树与暴力解法的区别和线段树的优化策略。
摘要由CSDN通过智能技术生成

博客园同步

原题链接

前置知识:

线段树 区间查询 / 区间修改

简要题意:

维护数组的区间加,乘,区间和。

首先,如果没有乘的话,直接把 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 的话,你先算加

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值