可以废话

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)));
}

posted on 2025-08-15 14:59  _Katyusha  阅读(7)  评论(0)    收藏  举报

导航