HDU 4578 Transformation 题解(线段树)

原链接
点我QωQ

题意简述

给定一个数列,要支持区间加,乘,赋值,和区间求一次,二次,三次方和。

数据

输入

第一行两个正整数 n , m n,m n,m n n n表示序列长度, m m m表示操作数。一个操作包含四个整数, o , l , r , x o,l,r,x o,l,r,x o = 1 , 2 , 3 o=1,2,3 o=1,2,3分别对应在 [ l , r ] [l,r] [l,r]内加/乘/改为 x x x o = 4 o=4 o=4表示询问 [ l , r ] [l,r] [l,r]之间的 x x x次方和(如果 o = 4 o=4 o=4,保证 x &lt; = 3 x&lt;=3 x<=3)。多组数据,如果 n = m = 0 n=m=0 n=m=0表示结束。

输出

对于每个 o = 4 o=4 o=4的询问,输出答案。

样例

输入
5 5
3 3 5 7
1 2 4 4
4 1 5 2
2 2 5 8
4 3 5 3
0 0
输出
307
7489

思路

这个题思路很明显,就是用线段树维护一下。就是代码量比较大,思维量也比较大。

首先我们要维护三个 l a z y t a g lazytag lazytag,三个值,三个 l a z y t a g lazytag lazytag分别命名为 a ( 即 a d d i t i o n ) , m ( 即 m u l i p l i c a t i o n ) , c ( 即 c h a n g e ) a(即addition),m(即muliplication),c(即change) a(addition),m(muliplication),c(change),分别表示加标记,乘标记,赋值标记。
三个值分别为 s 1 , s 2 , s 3 s1,s2,s3 s1,s2,s3,表示区间的一次方和,二次方和,三次方和。

当我们对区间进行赋值操作的时候,显然这优先级非常高,会覆盖掉所有的其他标记。此时设我们赋的值是 x x x,长度为 n n n,那么 s 1 = x ∗ n s1=x*n s1=xn, s 2 = x 2 ∗ n s2=x^2*n s2=x2n, s 3 = x 3 ∗ n s3=x^3*n s3=x3n.

当我们对区间进行乘法操作的时候,会对加法标记产生影响。设我们乘了 x x x,原来加标记是 a a a,表示我们加过 a a a,那么现在就要加 a x ax ax。同时,我们的 s 1 = s 1 ∗ x s1=s1*x s1=s1x, s 2 = s 2 ∗ x 2 s2=s2*x^2 s2=s2x2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值