看到数据范围1≤n≤1051≤n≤10^51≤n≤105就知道肯定不能暴力做,操作1,2,31,2,31,2,3对应的分别是区间乘,区间加和区间求和,很显然要利用带懒标记的线段树;
一个是乘法,一个是加法,用一个懒标记肯定是不够用的,所以可以新建两个懒标记:mulmulmul和addaddadd,修改时应表现为a×b+ca×b+ca×b+c的形式.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PUSHDOWN函数PUSHDOWN函数PUSHDOWN函数
pushdownpushdownpushdown需要先更新,因为乘法优先级大于加法,所以先乘后加,再下传两个标记,也是先乘后加,运算过程中始终保持a×b+ca×b+ca×b+c的形式
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
更新函数
先是乘法更新。前面说过,修改乘法时应表现为a×b+ca×b+ca×b+c的形式,那如果是先加后乘,它对add有什么影响呢,计算一下试试看(aaa为原值,bbb为add标记,ccc为mul标记):
(a+b)∗c=a∗b+b∗c(a+b)*c=a*b+b*c (a+b)∗c=a∗b+b∗c
可以发现,修改时不仅仅要把tagtagtag乘上valvalval,还要对addaddadd进行相同的操作,
至于加法更新就不说了,更简单
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
完整代码: