跳转至

世纪轰炸机:题解

解法比较

分块、卷积和直接累计适用于不同的参数范围,作为并列方案。标程采用直接累计,适合本题规模与 8 MB 内存限制。

出题人解法有两种实现,都利用一次区间投送等于“从 \(l\) 开始的后缀贡献”减去“从 \(r+1\) 开始的后缀贡献”,因此重叠操作可以先线性叠加。

分块版把贡献位置按块长 \(B\) 划分。边界块直接修改,整块先记下后缀起点及次数,最后逐块展开这些记录,再按各投送起点平移累计结果。其时间上界为 \(O(q(B+n/B)+n^2+kn+n+m)\) ,存储这些块与偏移计数需要 \(O(n^2/B+n+m+k)\) 空间;取 \(B\) 约为 \(\sqrt n\) .卷积版按后缀起点分组,把物资后缀和带正负号的投送位置计数多项式做 NTT,在变换域累计所有分组,最后统一逆变换。设变换长度为 \(H=O(n+m)\) ,出题人实现逐组扫描询问,时间上界为 \(O(nq+qk+nH\log H)\) ,空间为 \(O(H+n+q+k)\) .模数为 \(1004535809\) ;每个输出位置的最终非负答案不超过 \(9q\min(n,k)\le9qn\) ,小于该模数,因此最终余数就是整数答案。

Codex(GPT-6)采用的实现保留线性叠加,直接累计有效偏移,然后按投送起点平移,不保存询问、块偏移表或 NTT 工作区。令 \(h=\min(n,m)\) ,时间为 \(O(n+m+k+qh+kh)\) ,空间为 \(O(n+m+k)\) .它适合当前规模与 8 MB 内存限制,实现也较直接;分块法在询问更多时可能减少逐询问工作量,卷积法也有不同适用范围。这是时间与存储的取舍,没有两种实现的直接计时对照。

先按偏移合并

所有起点使用完全相同的投送列表,因此先计算单一起点的贡献。令 \(s_j\) 表示所有投送在相对起点偏移 \(j\) 处提供的补给总量。读入 \([l,r]\) 时,对 \(0\le j\le\min(r-l,m-1)\) 执行

\[ s_j\gets s_j+a_{l+j} \]

偏移不小于 \(m\) 的贡献一定越界,可以略去。随后对每个起点 \(p_i\) ,把所有未越界的 \(s_j\) 加到答案位置 \(p_i+j\) .

正确性

题目要求对每个投送、每个起点和每个合法偏移计算一次贡献。算法先固定偏移、对投送求和,再将该和加到各起点对应的位置。交换有限次加法的顺序不改变结果;被略去的偏移在任一起点都会越界。因此每个位置得到的总量恰好符合定义。

复杂度与实现

令 \(h=\min(n,m)\) .时间复杂度为 \(O(n+m+k+qh+kh)\) ,空间复杂度为 \(O(n+m+k)\) .本题规模允许直接枚举投送中的有效偏移,无需保存所有询问。参考程序使用固定上限数组,额外数组空间约为 \(48\) KB。