P6772 [NOI2020] 美食家

先考虑朴素动规:

\[f(i,u)=\max_{(v,u)\in E}(f(i-w_{(v,u)},v))+a_u+g(i,u) \]

得到一个复杂度 \(O(T(n+m))\) 的做法。发现 \(n\) 小但又不是那么小,而 \(T\) 又很大,于是考虑矩阵快速幂。其中定义一个新的矩阵运算 $C(i,j)=\max(A(i,k)+B(k,j)) $。那么如果 \(w\) 均为 \(1\) 且不考虑 \(g\) 就可以直接构造一个矩阵,若 \((i,j)\in E\)\(G(i,j)=a_j\),否则 \(G(i,j)=-\infty\)

但是目前有一个 \(w\) 的限制,但是 \(w\) 更是小到离谱。于是我们可以考虑拆点,将一个 \(u\) 拆成 \(u,u_2,u_3,u_4,u_5\),之后将相邻的边权设为 \(0\),然后对于 \(w_{(v,u)}\) 就将原先的连边转成 \((v_{w_{(v,u)}},u,a_u)\)。这样我们就用 \(O((5n)^3\log T)\) 以解决 \(k=0\) 部分。即 \(f(T)=f(0)\otimes G^T\)

之后考虑有 \(t_i\) 互不相同的性质。则我们可以分段考虑,不妨设 \(t_0=0\),若 \(t_k\neq T\),则 \(t_{k+1}=T\)。那么我们可以分段考虑,不妨假设我们知道了 \(f(t_{i-1})\),那么为了求出 \(f(t_i)\),我们只需要类比得到 \(f(t_i)=f(t_{i-1})\otimes G^{t_i-t_{i-1}}\)。时间复杂度 \(O(k(5n)^3\log T)\)

发现瓶颈在于每一次都需要重新做一次矩阵快速幂。我们可以提前预处理出 \(t_i-t_{i-1}\) 的二进制分解,即 \(\sum2^{p_j}=t_i-{t_{i-1}}\),在一开始预处理出 \(G^1,G^2,G^4,\cdots,G^{\log T}\)。那么每一次我们只需要让 \(f\)\(G^{p_j}\) 做操作即可。而又因为 \(f\) 为一个向量,故这样矩阵乘法的复杂度是 \(O((5n)^2)\) 的。就优化成了 \(O(k(5n)^2\log T+(5n)^3\log T)\)

posted @ 2025-11-23 21:00  tanghg  阅读(15)  评论(0)    收藏  举报