题解:P5319 [BJOI2019] 奥术神杖
假设包含了 \(k\) 个串(可重复),则答案 \(\lambda=\sqrt[k]{\prod_{i=1}^kV_i}\)。发现开根和连乘不好维护,因而考虑两边同时取 \(\ln\),则有 \(\ln\lambda=\frac{1}{k}\sum_{i=1}^k\ln V_i\)。稍微变化一下,有:
\[\ln\lambda=\frac{\sum_{i=1}^k\ln V_i}{\sum_{i=1}^k1}
\]
发现这个式子是经典的分数规划模型,因此设 \(g(\ln\lambda)=\max\sum_{i=1}^k(\ln V_i-\ln\lambda)\),\(g\) 为单调递减函数,且在 \(\lambda\) 取到答案时其值为 \(0\),因而可以二分。
考虑如何求 \(g\),我们对所有的串建 AC 自动机,将每个节点的权值设为它和它 fail 树上祖先的 \(\ln V_i-\ln\lambda\) 之和,然后暴力 DP 即可。时间复杂度为 \(O(ns\log_2\frac{\ln V}{eps})\)。
由于人傻常数大,我开 long double 最慢的一个点只能卡到 \(1.03s\)(悲),还是开 double 吧qaq

浙公网安备 33010602011771号