题解:P5319 [BJOI2019] 奥术神杖

link

假设包含了 \(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

posted @ 2025-02-20 16:29  FugiPig  阅读(22)  评论(0)    收藏  举报