2024.10.15 DP

做题

Posted by WrongAnswer_90's Blog on October 15, 2024

CF1993E Xor-Grid Problem

考虑新加一行一列,则每次操作就是第 $i$ 行和第 $n+1$ 行交换,或者第 $j$ 列和第 $m+1$ 列交换,这样行列就独立了。

分别求出来删掉一行后,列上面的最短哈密顿路,还有删掉一列之后,行上面的哈密顿路,时间复杂度 $\mathcal O(2^nn^2m+2^mm^2n+nm)$。

CF1852D Miriany and Matchstick

最暴力的 DP 是 $\mathcal O(n^2)$ 的。设 $f_{i,j,0/1}$ 表示当前填了 $i$ 位,这一位填的 A 还是 B,$j$ 个不同是否可行。猜到 $j$ 关于奇偶性分别都是一段区间,就很有道理。

结论可能更强?连续段个数是 $\mathcal O(1)$ 段,可以暴力维护(

CF573D Bear and Cavalry

没啥意思的题。

调整法可以证明一定是大的权值对应大的权值,所以排序之后,最多是相邻的三个数进行交换,动态 DP 一下就行了。

CF1392G Omkar and Pies

还挺牛。

交换感觉说的不是人话,考虑 $S$ 串经过了 $[l,r]$ 的交换之后变成了 $S’$,则 $S’$ 和 $T$ 相同的位数应当等于 $S$ 串经过 $[l,n]$ 的操作之后和 $T$ 串经过了 $[r+1,n]$ 的操作之后的串相同的位数。

这样找出来 $2n$ 个串,要找的就是相同位数最大并且距离 $\geq m$ 的串。暴力枚举相同的部分复杂度是 $3^k$,比较爆炸。但是考虑串中 $1$ 的个数是一定的,所以枚举公共为 $1$ 的部分,则 $0$ 公共的部分是可以计算出来的。用类似 FWT 的方法预处理 $f_i$ 表示 $i\subseteq S_j$ 的最小的 $j$,在预处理 $g_i$ 表示 $i\subseteq T_j$ 的最大的 $j$,判断一下即可。

CF1028G Guess the number

感觉有点魔怔。

首先考虑第一步的时候 $k$ 只能 $=1$。考虑第一步如果切在了 $l$,那就需要满足 $[1,l-1]$ 能用四次询问做出来,还有 $[l+1,M]$ 也要能用四次询问做出来。

设 $f_{i,j}$ 表示值域在 $[i,j]$,最少用几次。然后 $i,j$ 都 $<10000$。然后考虑进行值域反转!!!设 $f_{i,k}$ 表示知道值域 $\geq i$ 之后,用 $k$ 次操作可以确定的值域的上界。

转移就是几段前面的直接拼起来。

CF407D Largest Submatrix 3

考虑设 $f_{i,l,r}$ 表示上边界在 $i$,左右边界是 $l,r$,下边界最小是多少。考虑 $f_{i,l,r}$ 首先可以对 $f_{i+1,l,r},f_{i,l,r-1},f_{i,l+1,r}$ 取 $\min$,这样就考虑到了绝大多数的冲突,没有考虑的是 $(i,l)$ 和第 $r$ 列的冲突,还有 $(i,r)$ 和第 $l$ 列的冲突,可以简单处理。

CF868E Policeman and a Tree

考虑警察是怎么做的:一定是走到一个叶子抓住人,然后走到另一个叶子…考虑中途的状态,警察在某条边上,边的左侧有一些人,右侧也有一些人。

显然警察是不可能掉头的不然他就是唐。所以他一定是顺着边走到端点,然后发生博弈:罪犯把这一段的所有人分配到一些子树里,然后警察需要决策往哪个方向走最优。

这样状态也挺明显了:设 $f_{i,j,k}$ 表示在第 $i$ 条边上(边有向),然后朝向的地方有 $j$ 个人,反方向有 $k$ 个人。做上述博弈的数学语言就是要求如下式子:

\[\max_{j_1+j_2+\dots+j_m=j}(\min_{x}f_{u(x),j_x,j+k-j_x})\]

这个东西可以二分之后背包做,实际实现可以进行记忆化搜索,复杂度应该比较大,但是因为 $n$ 太小了所以还是能过。

优化的话考虑考虑,就考虑了考虑,这样就考虑出来了,时间考虑度就是考虑。

CF1830D Mex Tree

首先考虑一个很松的答案下界:相邻的染不同的颜色即按照深度奇偶染色。考虑亏了多少答案:最多最多是 $2n^2$,这样一个黑点亏了 $2$,一个白点亏了 $1$。一共亏的不超过 $1.5n$。

DP 的时候还是考虑亏了多少,应该是最小化白连通块选 $2$ 加上 $2$ 乘黑连通块选 $2$,所以设 $f_{i,j,0/1}$ 表示 $i$ 连通块是黑色还是白色,大小是 $j$。转移是树形背包。

但是根据上面的分析,答案亏的不会很多,所以 $j$ 这一维应该是 $\mathcal O(\sqrt n)$ 级别的。所以树形背包的复杂度可以分析到 $\mathcal O(n\sqrt n)$。但是空间炸了。

优化手段是重链剖分,把重儿子的 DP 数组直接拿来用,动态释放空间,这样每时每刻最多只需要存 $\log n$ 个 DP 数组,空间就不是瓶颈了(还是有点手法的)。

CF1476F Lanterns

设 $f_i$ 表示 $i$ 能覆盖的最长前缀,转移是如果 $f_{i-1}\geq i-1$,则 $i$ 可以向右连。

如果 $i$ 向左,则需要找一个 $j$ 满足 $f_j\geq i-p_i-1$,然后查询 $k\in [j+1,i-1]$ 的 $k+p_k$ 的最大值,找到最小的满足条件的 $j$,ST 表查询一下区间最大值即可。

CF1188D Make Equal

考虑直接做!$f_{i,S}$ 表示考虑了前 $i$ 位(使前 $i$ 位相等了),然后在第 $i$ 位上 $S$ 里面的数有进位的最小代价。然后注意到按照前 $i$ 位的相对大小排序之后,有进位的一定是一段后缀,然后就做完了 QWQ。

CF1572E Polygon

二分答案之后区间 DP,一定是能放就放,所以放了几个作为第一关键字,剩下多少面积作为第二关键字比较大小即可。

CF559E Gerald and Path

设 $f_{i,j,k}$ 表示前 $i$ 个灯,向右覆盖到了 $j$,最左边钦定覆盖的是 $k$。这样是 $\mathcal O(n^4)$ 或者 $\mathcal O(n^3)$。

我好牛,我会 $\mathcal O(n^2)$。设 $f_{i,j}$ 表示考虑了前 $i$ 条线段,钦定值域上的 $[1,j]$ 统计答案,最大贡献。性质是如果 $i$ 往左放,那一定存在一个 $[a_i-l_i,a_i]$ 的分界线,线左侧都朝左,右侧朝右。朝左的贡献就是 $f_{k,a_i-l_i-1}$,朝右的也只需要统计最大值。

CF1225G To Make 1

合并是一个树形结构,暴力做需要子集卷积,大概是 $\mathcal O(3^nV^2)$。非常爆炸。

考虑一层一层的加叶子,设 $f_{S,i}$ 表示用了集合 $S$ 中的数,当前层的和是 $i$,转移是新加入一个数,或者是整体除一个 $k$(向上走一层)。可以 bitset 优化,复杂度 $\mathcal O(2^n(S+\frac{nS}{w}))$。