题意简述
给一个长度为 n n n 的序列 a a a,支持 q q q 个操作:
I l r x
区间元素整体 + x +x +x。
R l r
区间元素整体 × ( − 1 ) \times (-1) ×(−1)
Q l r x
询问:从 [ l , r ] [l,r] [l,r] 中选择 x x x 个数的积的所有方案的和, m o d 19940417 \bmod 19940417 mod19940417。
n , q ≤ 5 × 1 0 4 n,q\le 5\times 10^4 n,q≤5×104。
所有操作保证 [ l , r ] [l,r] [l,r] 有意义。操作 I
中, x ≤ 1 0 9 x\le 10^9 x≤109;操作 Q
中, x ≤ m i n ( r − l + 1 , 20 ) x\le min(r-l+1,20) x≤min(r−l+1,20)
思路
我们观察到 x ≤ 20 x\le 20 x≤20。不妨在线段树中维护每一种情况的答案。设 S [ x ] S[x] S[x] 表示当前节点中选择 x x x 个数的积的所有方案的和。为了方便考虑,设 S [ 0 ] = 1 S[0]=1 S[0]=1。然后,显然还需要维护取相反数的标记和加法标记。
然后开始线段树传 统 艺 能了。
如何合并左右儿子的答案
我们在左半边选 a a a 个,右半边选 b b b 个,那就一共选了 a + b a+b a+b 个,贡献是 l S [ a ] × r S [ b ] lS[a]\times rS[b] lS[a]×rS[b]。其中 l S , r S lS,rS lS,rS 表示左儿子,右儿子的 S S S 数组。
如何单节点加值
我们其实就是要考虑这样一个东西:
a 1 × a 2 ⋯ × a m a_1\times a_2\cdots \times a_m a