省选计划(第六周)

知识回顾

  • 巩固:Lucas,网络流,二分图

  • 深入研究:背包DP,树形DP,区间DP,状压DP。

  • 简单了解/没学明白:博弈论,插头DP

练题

Working routine

读完题后以为矩阵可以相邻,费了一个小时去写...(可恶

直接暴力交换复杂度是 \(O(nmq)\),无法接受,考虑链表。

对于每个点 i,定义 \(right_i\) 为 i 的右继,\(down_i\) 为 i 的下继。

然后把矩阵边缘的那些点的 \(right\)\(down\) 交换一下就好了。

有些小细节。复杂度 \(O((n+m)q)\)

P8074 [COCI2009-2010#7] SVEMIR

最小生成树题。

考虑分别将 x,y,z 排序,只连相邻的边,总边数 \(3\times n\)

跑一边 kruskal 就行了。

复杂度 \(O(n \log n)\)

P8564 ρars/ey

很显然的树形背包。

定义 \(f_{i,j}\) 为以 i 为子树,删 j 个子节点的最小代价。

然后列式子卡上下界,经典背包。

复杂度 \(O(n^2)\)

P2197 【模板】nim 游戏

基础博弈论。

我们考虑将一个集合分为两部分,四种情况讨论:

  1. A 胜,B 胜,AB 不确定。

  2. A 胜,B 负,AB 胜。

  3. A 负,B 胜,AB 胜。

  4. A 负,B 负,AB 负。

可以发现这符合 xor 的性质。

假如先手面对石堆 A,剩下的为 B,那么 A ^ B = S。

其中 A 包含 S 的最高位。

如果 S 不为 0,那么先手一定可以取走一些石头使得 A = B。从而获胜。

如果 S 为 0,那么先手必败。

综上,只需要全部 xor 一遍看是否为 0 即可。

P2734 [USACO3.3]游戏 A Game

博弈论+DP。

定义 \(f_{i,j}\) 为作为先手,在 \([l,r]\) 这个区间里最多能获得的价值。

转移方程显然:

\[f_{i,j}=\max(sum_{i+1,j}-f_{i+1,j}+a_i,sum_{i,j-1}-f_{i,j-1}+a_j) \]

复杂度 \(O(n^2)\)

P1247 取火柴游戏

在 Nim 游戏的基础上输出先手第一次选取的方案。

我们知道 A ^ B = S,且 A 包含 S 的最高位,所以先手第一次要选 A - B 个。

找到最前面的即可。

P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈

神奇的博弈论板子。

我们称后手必胜态为奇异局势。那么前几个为:

\((0,0),(1,2),(3,5),(4,7),(6,10),(8,13)\)

可以发现第 i 个(编号从 0 开始)两者的差为 i,且第一个元素为前 i-1 组的 mex。证明略。

然后需要用到 beatty 定理:

设 a、b 是正无理数且 \(\frac{1}{a}+\frac{1}{b}=1\)。记\(P=\lfloor an\rfloor\)\(Q=\lfloor bn\rfloor\),其中 n 为任意正整数,则 P 与 Q 是 N+ 的一个划分。

证明略......

于是我们令第一个元素为 \(\lfloor an \rfloor\),第二个元素为 \(\lfloor (a+1)n\rfloor\)

\[\frac{1}{a}+\frac{1}{a+1}=1 \ (a>0) \]

解得 \(a=\frac{1+\sqrt 5}{2}\)

所以对于每个询问,我们只需计算出两个数的差,然后根据公式判断第一个元素是否与算出来的相等即可。

P3807 【模板】卢卡斯定理/Lucas 定理

针对模数比较小的组合数运算。

通过推一坨我不懂的式子可以得出:

\[\dbinom{n}{m}\bmod P=\dbinom{\frac{n}{P}}{\frac{m}{P}}\cdot \dbinom{n \bmod P}{m \bmod P}\bmod P \]

对于第二项,由于 n,m 都小于 P,可以直接算出。

对于第一项,继续递归处理。

Christmas Game

Nim游戏+换根DP。

我们定义每个节点的深度为 \(\lfloor \frac{dep_i}{k} \rfloor\),也就是能挪多少次。

如果深度为偶数,则上面的石子不会影响局面,因为挪完后先后手的顺序不变。

如果深度为奇数,则挪完一次后深度变为偶数,相当于选择一部分石子扔掉。

诶!这不就是 Nim 游戏吗。

于是我们可以把深度为奇数的那些石子数异或起来,然后换根DP。

定义 \(f_{i,j}\) 为对于当前节点 i,深度模上 \(2\times k\) 为 j 的子节点的石子数之和。

那么对于当前节点的答案就是 \(\sum\limits_{j=k}^{2k-1}f_{i,j}\),仔细想想就能理解。

然后换根的公式是借鉴题解的,因为我推的太麻烦了,简直不是给人看的......

可以定义临时变量 \(g_i\) 为除去以当前节点 u 为根的子树,剩下部分的答案。

\[g_{(j+1)\bmod 2k}=f_{u,(j+1)\bmod 2k} \land f_{v,j} \]

这里 f 的定义不再是之前的了,变为以其为根的答案。

\[f_{v,(j+1)\bmod 2k}\land=g_j \]

这样就行了。

复杂度 \(O(nk)\)

P5999 [CEOI2016] kangaroo

插头DP。

定义 \(f_{i,j}\) 为前 i 个数,分为 j 段,每段互不影响的方案数。

假设 i 不为 s 或 t。

  1. 合并两段:\(f_{i,j}=f_{i-1,j+1}\cdot (j-num)\),其中 num 为 \((i>s)+(i>t)\)

  2. 新成一段:\(f_{i,j}=f_{i-1,j-1}\cdot j\)

起点和终点的位置唯一,所以 \(f_{s,j}=f_{s-1,j-1}+f_{s-1,j}\),t 同理。

最终答案 \(f_{n,1}\)

复杂度 \(O(n^2)\)

P3188 [HNOI2007]梦幻岛宝珠

背包+状压DP。

直接做肯定不行,但是我们发现每个 \(w_i\) 都可以表示成 \(a\times 2^b\) 的形式,而且 a,b,n 都很小。

考虑以 b 分组。

定义 \(f_{i,j}\) 为在 \(2^i\) 这组中,容量为 \(j\times 2^i\) 的情况下,最大价值是多少。

f 可以直接用传统背包解决。

揭晓来考虑怎么将不同的 b 合并起来。

定义 \(g_{i,j}\) 为考虑 0 到 i 这些物品,其中 b 为 i 的物品给 \(j\times 2^i\) 空间,最大最大价值。

怎么借助 f 转移呢?我们可以考虑 i 物品实际上用了多少容量。

\[g_{i,j}=\min(f_{i,j-k}+g_{i-1,2k+(W>>(i-1))\And1}) \]

从高位到低位,k 需要乘 2,然后再加上 i-1 为上原来的容量。

注意,由于 g 的第二维可能很大,可以和 \(10\times n\) 取个 min。

最后输出 \(g_{\log_2m,1}\) 即可。

复杂度 \(O(T\cdot 3000\cdot n^2)\),实际上远小于。

Paint

区间DP。

容易想出一个非常暴力的状态,\(f_{i,j,k}\) 表示把区间 \([i,j]\) 染成颜色 k 的最小操作,复杂度 \(O(n^4)\),直接起飞,考虑优化。

定义 \(f_{i,j}\) 为将区间 \([i,j]\) 染成 \(c_j\) 的最小操作数。

为什么是 \(c_j\) 呢?因为如果是其他颜色,还要改 \(c_j\),不如直接把 \([i,j-1]\) 染成 \(c_j\)

第一种转移:

\[f_{i,j}=\min(f_{i+1,j},f_{i,j-1})+1 \]

+1 是因为默认与单个的颜色不同。

第二种转移:

\[f_{i,j}=\min(f_{i,k}+f_{k+1,j}) \]

其中 \(c_k=c_j\)。很显然,无需解释。

复杂度 \(O(20\cdot n^2)\)。常数很小。

P4766 [CERC2014]Outer space invaders

看起来很像是贪心,但仔细想想就会发现不行。

可以尝试区间 DP。

定义 \(f_{l,r}\) 为把所有被包含在区间 \([l,r]\) 内的外星人杀掉所用最小代价。

根据正常的套路,我们需要将区间分为互不干扰的两部分,然后分别求解。

然后我们发现可以枚举距离最大的外星人 k 被杀的时间 mid。

\[f_{i,j}=\min(f_{i,mid-1}+d_k+f_{mid+1,j}) \]

为什么能把区间断开呢?

如果时刻 mid 还有其他外星人,那么 mid-1 和 mid+1 就会割掉它区间的一部分,也就不再接下来的考虑范围里了,相当于和 k 一起被杀了。

注意需要离散化。

复杂度 \(O(n^3)\)

P4099 [HEOI2013]SAO

一年半前做过一次,没做出来,现在看还是不会......唉,拉了呀!

如果是一棵树的话,肯定可以做,但这题是个 DAG,所以我们需要正反两种边分别做一下。

定义 \(f_{i,j}\) 为节点 i 在其子树中排名为 j 的方案数。

假设 u 的排名为 p,儿子 v 的排名为 q,且边为 \((v,u)\)

定义 k 为 u 加上 v 后的排名,那么子树 v 中一定右 k-p 个排名小于 p 的,而 v 的排名小 u,所以 \(q\le k-p\)\(q+p\le k\)

排在 u 之前的有 p-1 个是原来的,排在 u 之后的有 \(siz_u-p\) 个是原来的,所以和新加入的儿子 v 组合一下就是 \(\dbinom{k-1}{p-1}\cdot \dbinom{siz_u+siz_v-k}{siz_u-p}\)

所以转移方程为:

\[f_{u',k}=\sum\limits_{p=1}^{siz_u}\sum\limits_{q=1}^{siz_v}[q+p\le k] \dbinom{k-1}{p-1}\cdot \dbinom{siz_u+siz_v-k}{siz_u-p}\cdot f_{u,p}\cdot f_{v,q} \]

同理考虑边为 \((u,v)\) 的情况。

因为 v 的排名要比 u 靠后,所以 \(q>k-p\)\(q+p>k\)

然后转移还和之前一样。

现在复杂度是 \(O(n^3)\),我们需要尝试优化掉一个 \(\sum\)

将与 p 有关的都提到前面:

  1. \((v,u)\)

\[f_{u',k}=\sum\limits_{p=1}^{siz_u}\left(f_{u,p}\cdot \dbinom{k-1}{p-1}\cdot \dbinom{siz_u+siz_v-k}{siz_u-p}\cdot \sum\limits_{q=1}^{k-p}f_{v,q}\right) \]

  1. \((u,v)\)

\[f_{u',k}=\sum\limits_{p=1}^{siz_u}\left(f_{u,p}\cdot \dbinom{k-1}{p-1}\cdot \dbinom{siz_u+siz_v-k}{siz_u-p}\cdot \sum\limits_{q=k-p+1}^{siz_v}f_{v,q}\right) \]

最后的那个 \(\sum\) 可以用前缀和优化掉。

注意:上下界一定要卡好,\(f_{i,1}=1\)

复杂度 \(O(n^2)\)

P6268 [SHOI2002]舞会

一道网络流/二分图的题。

首先,我们可以黑白染色把男女分开,搞成一个二分图。

然后,要求出这个图的最大独立集,也就是总人数 - 最大匹配数。

网络流和 KM 都可以做。我用的是网络流。

posted @ 2023-07-17 23:10  HQJ2007  阅读(11)  评论(0)    收藏  举报