luogu3373 【模板】线段树2

题目大意:

已知一个数列,你需要进行下面三种操作:
1.将某区间每一个数乘上x
2.将某区间每一个数加上x
3.求出某区间每一个数的和

本线段树的标记是个二元组:add和mul,其代表将一个线段中的每一个点乘以mul再加add。设区间长度为x,原来区间和为sum。如果两个标记要叠加,标记叠加前区间上的和将是sum*mul+add,叠加后的值将是(sum*mul+add)*mul'+add'=mul*mul'*sum+add*mul'+add'。所以将mul*=mul', add=add*mul'+add'即可。

注意:

  • 尽管数据关于P取模了,但是因为有数据相乘的操作,所以程序中所有的值类型都要是long long
  • 宏定义ModPlus, ModMult时,如ModMult,不要写成((x%P)*(y%P))%P,应该写成(x*y)%P,否则就被卡常数了。

  

 

posted @   headboy2002  阅读(151)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示