bzoj2962 序列操作

链接bzoj2962

有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。

我好菜啊qwq
这题要求维护一个序列,我们可以用线段树来维护。其中有两种变换操作, 一种查询操作。
查询操作是查询区间内 c 个数的卷积,因为1c20 ,所以我们可以考虑直接暴力求值,用 f[i] 表示当前节点 i 个值相乘的答案。
对于取反操作:
我们发现,区间[l,r]之内的数取反之后 f[i] 变为 f[i](1)i ,即当且仅当 i 为奇数的时候f[i]会变化。所以我们只要把每一个为奇数的 i f[i]更改为 f[i]
对于区间增加值的操作:
就比较麻烦了…我们先试图对 i=3 的情况举例(打表找规律)
设要维护区间之中有3个数 a,b,c,d ,要增加的数为 x ,我们要更新f[3]。那么就有:

f[3]=(a+x)(b+x)(c+x)+(a+x)(b+x)(d+x)+(a+x)(c+x)(d+x)+(b+x)(c+x)(d+x)

=x3+[(a+b+c)+(a+c+d)+(b+c+d)+(b+c+d)]x2+[(ab+bc+ac)+(ac+ad+cd)+(ab+ad+bd)+(bd+bc+cd)]x+[(abc+acd+abd+bcd)]

=4x3+3(a+b+c+d)x2+2(ab+bc+ac+ad)x+(abc+abd+acd+bcd)

=4f[0]x3+3f[1]x2+2f[2]x+f[3]

观察得,对于每一个 xj 的系数 j[0,i] ,我们发现每次会产生 Cin Cji 个数的乘积。而 Cji 个数的乘积中有 Cjn 个数可以组成一个 f[ij] ,即
f[i]=j=0ixjCijCniCjn

化简得
f[i]=j=0ixjCijnj

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值