第一条很显然。
第二条,从模 k k k 意义上来说,对一个数加 x x x 加 x m o d k x \bmod k xmodk 是等价的,不妨令 x ∈ [ 0 , k − 1 ] x \in [0,k-1] x∈[0,k−1]。如果满足性质二,那么两个满足模 k k k 余 k − x k-x k−x 的 a a a 的 gcd \gcd gcd 一定为 k k k 的整数倍。代码
最终的路径简单概括就是:赚钱、走、赚钱、走…
因此考虑将最终的路径化为若干段路径,划分的路径都在起点处赚钱。
做法:先 floyd 出任意两点之间的花费。定义 u → v u \to v u→v 的次数花费为 ⌈ s ( u , v ) − g u a u ⌉ \lceil \dfrac {s(u,v) - g_u} {a_u} \rceil ⌈aus(u,v)−gu⌉,其中 s ( u , v ) s(u,v) s(u,v) 为 u , v u,v u,v 间最短路的花费, a u a_u au 为在 u u u 处一次演出钱, g u g_u gu 为走到 u u u 剩下的钱。按照次数花费建新图,跑最短路。这里把 dij 认为是贪心的话就很好理解了。
代码
先考虑树退化成一条链的情况,区间 dp:记 f l , r f_{l,r} fl,r 表示 [ l , r ] [l,r] [l,r] 匹配的最长回文串长度,有:
f l , r = max { f l + 1 , r f l , r − 1 f l + 1 , r − 1 + [ a l = a r ] \large f_{l,r}=\max\begin{cases} f_{l+1,r} \\ f_{l,r-1}\\ f_{l+1,r-1} +[a_l=a_r] \end{cases} fl,r=max⎩ ⎨ ⎧fl+1,rfl,r−1fl+1,r−1+[al=ar]
对于树的情况,其实就是若干条链,确定了两端的点 u , v u,v u,v 就是链的情况。具体转移需要知道 x x x 向 y y y 方向移一个点的 x ′ x' x′,可以通过 dfs 预处理出 x x x 在 y y y 为根的树时的父亲结点,该父亲点即为 x ′ x' x′。
有:
f u , v = max { f u ′ , r f u , v ′ f u ′ , v ′ + [ a u = a v ] \large f_{u,v}=\max\begin{cases} f_{u',r} \\ f_{u,v'}\\ f_{u',v'} +[a_{u}=a_{v}] \end{cases} fu,v=max⎩ ⎨ ⎧fu′,rfu,v′fu′,v′+[au=av]
代码
最水 3000*。
建圆方树,方点设为 bcc 边数,圆点设为 0,即求路径点权和。
没写。