【考试总结】2022-08-09
ddtt
强连通分量可以通过基部分延伸出一条起终点都在自己的链来得到。
那么设 \(f_S\) 表示 \(S\) 集合中元素都在强连通分量中的最小代价。由于要延伸一条链,于是再设 \(g_{S,x,y}\) 有一条链和基部分覆盖了 \(S\) 中元素,且这条链现在延伸到了 \(x\),目标终点是 \(y\) 的最小代价。更新 \(f_{S}\) 就用 \(g_{S,x,y}\) 和 \((x,y)\) 之间的边来做。
当起始终止点重叠时,需要枚举最初的两步。剩下的一步一步扩展即可
菱形覆盖
区分下面描述的 “正三角” 和 “等边三角形”
使用 Hall 定理解决本题中完美匹配的情况。将倒三角视为二分图的左部。那么 Hall 定理中每个集合都要满足的邻域大小限制可以变成 “边长为 \(i\) 的等边三角形中不能删除超过 \(i\) 个正三角”。这步转化也可以理解为尽可能增多两个倒三角的邻域的交集。这里定义 “满三角形”:不能再出现被删除的正三角了
不加证明地给出本题构造做法:
从 \(n\) 到 \(2\) 遍历每一行。这一行第一个被删掉的正三角左边和最后一个被删掉的正三角右边都是可以直接实现覆盖。设被删去的正三角位置是 \(a_1\dots a_k\),此时需要强制在 \(a_i,a_{i+1}\) 之间放一个竖直方向的菱形。而这也会影响到上一行的放置情况。
使用线段树配合扫描线来求出满三角形,包含每个右端点最大的满三角形中的倒三角不能被放置垂直菱形。求出来 \((a_{i},a_{i+1})\) 区间中哪些位置可以放是一个差分的过程。找到那些可以放置垂直菱形的位置中最靠左的一个进行放置即可。
也可以理解成,找到 \(n-1\) 行上 左端点在 \(a_1\) 左侧的满三角形中右端点最靠右的一个(这个右端点必然在 \(a_2\) 以左,否则延伸到第 \(n\) 行就撑死了),并让该位置的倒三角被垂直覆盖,更新线段树上满三角形情况。下一个垂直放置的位置就是找到左端点在 \(a_2\) 以左的满三角形中右端点最靠右的一个并以此类推。
可以通过贪心感性理解这个过程
排列
将两个差为 \(K\) 的元素连边,于是这时候形成了若干条相互独立的链。
设 \(f_{i,j}\) 表示使用了链上前 \(i\) 个元素拼成的序列中有 \(j\) 个位置被强制满足相邻两个差的绝对值为 \(K\)。可以据此计算出最终 \(n\) 个元素被分成 \(j\) 条链的方案数,这 \(j\) 条链之间的顺序可以任意分配。
转移显然枚举每条已知的链,如果这条链上遍历过的元素多于 1 可以将其翻转,于是需要加一维度 \(0/1\) 表示这条链上上一个元素是不是被钦定非法了。