可以废话
Another n-dimensional chocolate bar
暴力的式子是:\(f_j = \max\limits_{k=1}^j{\frac{g_{\lceil{\frac{j}{k}}\rceil}\times\lfloor{\frac{a_i}{k}}\rfloor}{a_i}}\)
首先,最开始的状态是 \(m\),然后每次更新后的状态肯定是 \(\lceil{\frac{m}{i}}\rceil\),因为整除分块所以状态数直接被缩成 \(\sqrt m\) 级别的数,然后发现 \(\lceil{\frac{j}{k}}\rceil\) 也是可以整除分块,所以最后做两次整除分块就可以了,这就是正解,时间复杂度是 \(\mathcal{O}(n\times k^{\frac{3}{4}})\),下面来证明一下为啥是这个。
复杂度的式子是 \(n\times(\sum\limits_{k=1}^{\sqrt m}\sqrt k+\sqrt{\frac{m}{k}})\),单独把后面那个东西单独拎出来积分,式子就是这样的:
\[\int_{1}^{\sqrt m}{\sqrt x}\,dx+\int_{1}^{\sqrt m}{\sqrt{\frac{m}{x}}}\,dx
\]
发现左边是 \(m^{\frac{3}{4}}\) 级别的式子,右边也是 \(m^{\frac{3}{4}}\) 级别的式子,所以总复杂度就是 \(\mathcal{O}(n\times k^{\frac{3}{4}})\)
最后放一下代码:
for (int i = 0; i < S.size(); ++i) {
if (g[i + 1] < 1e-10) continue;
for (int l = 1, r; l <= S[i]; l = r + 1) {
int j = id[S[i] / l];
f[j] = max(f[j], g[i + 1] / val * (val / l));
r = S[i] / (S[i] / l);
}
f[idx] = max(f[idx], g[i + 1] / val * (val / (S[i] + 1)));
}
浙公网安备 33010602011771号