2023.7.2 Lby 杂题选讲

P6811 「MCOI-02」Build Battle 建筑大师

诸如这样的序列长为 \(n\)\(1,2...,m-1,m,1,2,...,m-1,m,1,2,3\)
我们称 \(1,2,...,m-1,m\) 为一个块。
问有多少本质不同的子序列。

如果我们把每个子序列往原序列里面填,每个子序列都有其最小表示法。
\(1,2,2,3\) 就被填在第一个块的 \(1,3\) 和第二个块的 \(2,3\)

我们现在做动态规划,保证计算中必须是最小表示,这样就不会重复。
\(f_i\) 表示以 \(i\) 结尾的状态个数。
\(f_i=\sum f_j ,(i-m \le j \le i-1)\)
前缀和 \(f_i=s_{i-1}-s_{i-m-1}\)
所以 \(s_i=2\cdot s_{i-1}-s_{i-m-1}\).
答案是 \(s_n\)

我们现在试图对不同的 \(m\) 快速的求 \(s_n\).
我们发现 \(s_n\) 跟已下问题等价:
\(0\) 跳到 \(n\),一开始 \(v=1\).
有两种行动方式:
一个是往前跳 \(1\) 步,令 \(v=v\cdot 2\).
或跳 \(m+1\) 步,令 \(v=-v\).
\(s_n\) 为所有跳到 \(n\)\(v\) 的和。

对于每个 \(m\),直接枚举第二种跳了多少次。
\(Ans_m=\sum_{i=0}^{n/(m+1)}(-1)^i\cdot 2^{n-i(m+1)}\cdot C_{n-i\cdot(m+1)+i}^i\)
复杂度调和级数。

CFgym104396B Honkai in TAIKULA

给定一张有向带权图,对每个节点,
若不存在奇权圈(可经过重复顶点、重复边,若经过重复边,边权计多次),
输出Battle with the crazy Honkai,
否则,输出最小奇权圈的权值(负无穷输出 Haha, stupid Honkai)。

首先用 tarjan 算法将图分为若干个强连通分量,
针对每个强连通分量分别进行计算。

先拆点,把一个点拆成奇点和偶点。
按照图中的奇偶性连边。
可以发现若对于一个点,奇点能到达偶点,那么图中存在长度为奇数的圈。

对于每一个节点那么我们先判断奇点能否到达偶点。
若不能,输出 Battle with the crazy Honkai
若存在负权圈,那么输出 Haha, stupid Honkai
若不存在负权圈,直接输出奇点到偶点路径长度。

由于存在负边,用 Johnson 算法即可。

CF626F Group Projects

将原序列分组,每组的价值是其最大值减最小值。问价值的和小于 \(K\) 的方案数。

首先先把原序列从小到大排序。
我们设当前 dp 到 \(i\),之前已经分了若干组,
其中有 \(j\) 组还没确定最大值,即剩下的组已经确定最大值了(已经计算完贡献)。
现在已经价值的和为 \(k\).
设这样的状态的方案数为 \(f_{i,j,k}\).

我们现在 dp 到 \(i\),以下展示了能进行的四个操作(称确定最大值为“闭合”)。
1、找一个组合并,那个组仍未闭合。
2、找一个组合并,那个组以 \(i\) 为最大值闭合了。
3、新开一个组,那个组未闭合。
4、新开一个组,那个组闭合了。

\( f_{i,j,k}=\sum \begin{cases} j\times f_{i-1,j,k} \\ (j+1)\times f_{i-1,j+1,k-a_i} \\ f_{i-1,j-1,k+a_i} \\ f_{i-1,j,k} \\ \end{cases} \)

然而,这样 \(k\) 的值域或许到达 \(\pm10^4\),时空开销过大。
我们考虑把一个组的贡献平摊到每个点上。
若这个组最小的是 \(a_l\),最大的是 \(a_r\).
发现 \(a_r-a_l=\sum_{i=l+1}^r a_i-a_{i-1}\)
那么 \([l,r]\) 的所有点都可以做贡献(无论是否在组内)。

于是我们可以这样:设 \(d=a_i-a_{i-1}\)

\( f_{i,j,k}=\sum \begin{cases} j\times f_{i-1,j,k-j\times d} \\ (j+1)\times f_{i-1,j+1,k-(j+1)\times d} \\ f_{i-1,j-1,k-(j-1)\times d} \\ f_{i-1,j,k-j\times d} \\ \end{cases}\ \)

posted @ 2023-07-03 14:36  s1monG  阅读(78)  评论(0)    收藏  举报