知识回顾
-
巩固:Lucas,网络流,二分图
-
深入研究:背包DP,树形DP,区间DP,状压DP。
-
简单了解/没学明白:博弈论,插头DP
练题
读完题后以为矩阵可以相邻,费了一个小时去写...(可恶
直接暴力交换复杂度是 \(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)\)。
很显然的树形背包。
定义 \(f_{i,j}\) 为以 i 为子树,删 j 个子节点的最小代价。
然后列式子卡上下界,经典背包。
复杂度 \(O(n^2)\)。
基础博弈论。
我们考虑将一个集合分为两部分,四种情况讨论:
-
A 胜,B 胜,AB 不确定。
-
A 胜,B 负,AB 胜。
-
A 负,B 胜,AB 胜。
-
A 负,B 负,AB 负。
可以发现这符合 xor 的性质。
假如先手面对石堆 A,剩下的为 B,那么 A ^ B = S。
其中 A 包含 S 的最高位。
如果 S 不为 0,那么先手一定可以取走一些石头使得 A = B。从而获胜。
如果 S 为 0,那么先手必败。
综上,只需要全部 xor 一遍看是否为 0 即可。
博弈论+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)\)。
在 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}\)。
所以对于每个询问,我们只需计算出两个数的差,然后根据公式判断第一个元素是否与算出来的相等即可。
针对模数比较小的组合数运算。
通过推一坨我不懂的式子可以得出:
\[\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,可以直接算出。
对于第一项,继续递归处理。
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)\)。
插头DP。
定义 \(f_{i,j}\) 为前 i 个数,分为 j 段,每段互不影响的方案数。
假设 i 不为 s 或 t。
-
合并两段:\(f_{i,j}=f_{i-1,j+1}\cdot (j-num)\),其中 num 为 \((i>s)+(i>t)\)。
-
新成一段:\(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)\)。
背包+状压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)\),实际上远小于。
区间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)\)。
一年半前做过一次,没做出来,现在看还是不会......唉,拉了呀!
如果是一棵树的话,肯定可以做,但这题是个 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 有关的都提到前面:
- \((v,u)\):
- \((u,v)\)
最后的那个 \(\sum\) 可以用前缀和优化掉。
注意:上下界一定要卡好,\(f_{i,1}=1\)。
复杂度 \(O(n^2)\)。
一道网络流/二分图的题。
首先,我们可以黑白染色把男女分开,搞成一个二分图。
然后,要求出这个图的最大独立集,也就是总人数 - 最大匹配数。
网络流和 KM 都可以做。我用的是网络流。
标签:dbinom,省选,siz,复杂度,第六周,cdot,计划,sum,DP From: https://www.cnblogs.com/HQJ2007/p/17561600.html