徐州 D Rikka with Subsequences
UpSolved by XLor.
求每种本质不同好子序列的出现次数立方和。
令 $f(a)$ 表示子序列 $a$ 的出现次数,立方和展开一下,$\sum_{i=1}^{f(a)} \sum_{j=1}^{f(a)} \sum_{k=1}^{f(a)} 1$。观察上式的实际意义,等价于将序列复制三份,求公共好子序列的个数。举例来说,假如 $a$ 作为子序列出现了 $2$ 次,分别出现在位置序列 $a_1,a_2$,那么有公共子序列 $(a_1,a_1,a_1)$ 一直到 $(a_2,a_2,a_2)$ 共 $8$ 种对应。
记 $dp(i,j,k)$ 表示在第一个串以 $i$ 结尾,第二个 $j$ 结尾,第三个 $k$ 结尾的方案数。$dp(i,j,k)$ 有值当且仅当 $a_i=a_j=a_k$。
$$
dp(i,j,k)=[ a_i=a_j=a_k ]( \sum_{i’=1}^{i-1} \sum_{j’=1}^{j-1} \sum_{k’=1}^{k-1} dp(i’,j’,k’) [M(a_{j’},a_i)] )
$$
转移过程相当于同时从 $(i’,j’,k’)$ 走到 $(i,j,k)$,我们将这个过程拆开变成 $3$ 个阶段,钦定先走 $i$,再走 $k$,最后走 $j$。也就是说最后一步的 $j’$ 和 $i$ 两个之间必须可以走。
枚举 $i$,令 $f(i,j,k) = \sum_{i’=1}^{i=1} dp(i’,j,k)$, $g(i,j,k) = f(i,j,k) [M(a_j, a_i)]$。
$$
dp(i,j,k)=[ a_i=a_j=a_k ] ( \sum_{j’=1}^{j-1} \sum_{k’=1}^{k-1} \sum_{i’=1}^{i=1} dp(i’,j’,k’) [M(a_{j’}, a_i)]) \
dp(i,j,k)=[ a_i=a_j=a_k ] ( \sum_{j’=1}^{j-1} \sum_{k’=1}^{k-1} g(i,j’,k’)) \
$$
因此,$dp$ 的转移,只需要对 $g$ 数组做一次二维前缀和即可。
徐州 F Rikka with Nice Counting Striking Back
UpSolved by XLor
求母串的本质不同子串个数,且子串 $T$ 满足,对于任意非空串 $P$,若 $TP=PT$,那么 $TP$ 不是 $S$ 的子串。
观察一下,对于子串 $T$,当存在 $TT$,$T$ 不合法,存在 $TTT$,$TT$ 不合法,也就是对于这样的一组串只会算一次。
上述等价于,减去多算的 $TT,TTT,TTTT,\dots$,暴力枚举每个 Runs 内部的每个右端点的周期串,哈希去重。
徐州 G Rikka with Intersections of Paths
UpSolved by XLor
给定树上 $q$ 条路径,求选出 $k$ 条有公共点的路径的方案数。
对于一种选择方案,公共点数减去公共边数等于 $1$。
对于所有点和边,分别求其出现在多少条路径上,相减即为答案。
青岛 I Soldier Game
UpSolved by XLor.
给定一个序列,将序列划分为长度为 $1$ 或 $2$ 的子串,最小化每个子串和的极差。
显然,枚举最小值,dp 出可能的最小的最大值。
令 $\infty$ 表示情况不存在,$-\infty$ 表示任意。
记 $dp(i,0/1)$ 表示 $i$ 位置是否被用过的最小最大值,当前下界为 $D$。
$$
dp(i,0)=dp(i-1,1) \
dp(i,1)=\min(\max(a_i+a_{i-1}, dp(i-1,0)), \max(a_i, dp(i-1,1)))
$$
上式中的 $a_i,a_i+a_{i-1}$ 均会在 $< D$ 时,被换成 $\infty$。最终最小的最大值为 $dp(n,1)$。
上面的 $dp$ 状态改成可以线段树动态维护的,允许区间合并的状态。
令 $dp(l,r,0/1,0/1)$ 表示:
合并时,只需要枚举中间两个位置的情况即可。