[Luogu 11772] 报社天狗
方便起见,将原文中 \(b\) 的下标整体平移 \(1\),那么所求即:(下面的 \(n / i\) 向下取整。)
\[\begin{aligned}
& \sum_{i = 1}^n a_i \sum_{j = d(i) + 1}^{n / i} b_j\\
=& \sum_{i = 1}^n a_i \sum_{j = 1}^{n / i} b_j - \sum_{i = 1}^n a_i \sum_{j = 1}^{\min(d(i), n / i)} b_j\\
=& \sum_{i = 1}^n a_i \sum_{j = 1}^{n / i} b_j - \sum_{j = 1}^n b_j \sum_{i = 1}^{n/j}[j \le d(i)]a_i
\end{aligned}
\]
前面那一项可以直接数论分块+序列分块,\(O(\sqrt n)\) 单点修改,\(O(1)\) 查前缀和,单次 \(O(\sqrt n)\) 计算它的值。
发现最大的 \(d(i)\) 为 \(240\),且不同的 \(d(i)\) 有 \(94\) 个,直接开 \(94\) 个树状数组维护每个 \(\sum_{i=1}^k[j \le d(i)]a_i\),每次询问 \(j\) 从 \(1\) 枚举到 \(240\) 查询。
时间复杂度 \(O(q(\sqrt n + D \log n))\),其中 \(D = \max d(i) = 240\)。

浙公网安备 33010602011771号