区间加多项式问题的研究
问题描述
给定一个长度为
- 修改操作:每次给定一个区间
$[l, r]$ 以及一个$K$ 次多项式$P(x)$ ,要求将$[l, r]$ 的第$k$ 项加上$P(k)$ 。也就是$A[l + k - 1]$ 加上$P(k)$ ,对于所有的$1 \leqslant k \leqslant r - l + 1$ 。 - 查询操作:查询操作分为两种 (i) 给定位置
$k$ ,要求输出$A[k]$ 的值 (单点查询); (ii) 给定区间$[l, r]$ ,要求输出区间$[l, r]$ 内所有数之和,即$\sum_{k = l}^r A[k]$ (区间查询)。
记操作总数为
解决方案
在线算法
我们可以首先考虑一个简化的修改操作:每次指定区间为
回到原先的问题,发现
现在的问题是我们需要得到
此时右边的式子已经变成了一个卷积的形式。令
令
因此,我们可以在
离线算法
接下来的目标是让时间复杂度变得与序列长度
为了方便,我们先只考虑单点查询。由于需要支持修改过程中的查询,所以对每个操作记录一个时间戳
现在来考虑区间查询。我们知道,利用前缀和,可以将区间和变为两个单点值之差。利用这一点,不难想到我们可以直接将多项式
到了这种时候,我们可能又会想要 FFT 出场了。在此之前,我们需要选择一个便于变形的公式。我经过一番挑选,发现还是伯努利公式形式最优秀:
其中
接下来又要经过一番套路变形:
Alright!3又是熟悉的面孔。故技重施,令
最后,我自己使用 C++ 实现了离线算法,如果想要查看可以前往 我的 GitHub。