邪恶波兰题选做

波兰题,太邪恶了

其实都是很好的题。

P3427

简单计数。

首先手玩一些样例可知,给出的图中若存在环,则无解,所以图一定是一个森林。

考察其中一个大小至少为 \(2\) 的联通块。这个联通块一定是由一条链以及链上的节点挂的叶子组成的。这个联通块可以左右翻转、上下翻转,且一个节点上挂的叶子可以排列,因此一个联通块的方案数为 \(4\prod\limits_u(|E_u|-\sum\limits_v\left[|E_v|\ge 2\right])!\),其中 \(E_x\) 表示 \(x\) 连的边集合。需要注意的是,如果是一个菊花图则上下不能翻转,需要特判。

然后考虑联通块之间的组合。先放所有大小至少为 \(2\)\(c_2\) 个,因为这些联通块一定两边都有点,无法交叉,方案数是 \(c_2!\)。然后放 \(c_1\) 个单点,可以任意放一个空位,方案数为 \((c_1+c_2+2)^{\underline{c_1}}\)。全部乘起来就是最终答案。

P3429

结论题。手玩样例可以得出结论:对于任意一张图,存在一种方案使得每个点集内奇点个数为 \(0\),写个异或高斯消元即可。

给出证明:

高斯消元的构造是:对于奇点,自己和所有邻域点系数为 \(1\), 右边为 \(1\);对于偶点,所有邻域点系数为 \(1\),右边为 \(0\)

设高斯消元的矩阵为 \(b\),如果存在一张图 \((V,E)\) 使得高斯消元无解,则需满足以下条件:

  • \(\exists S\subseteq V,\forall i\in V,\bigoplus\limits_{u\in S}b_{u,i}=0,\bigoplus\limits_{u\in S}b_{u,n+1}=1\)

这个东西的一个必要条件是:存在点集 \(S\),满足 \(S\) 内有奇数个奇点,且仅保留存在这些点作为端点之一的边时,\(S\) 外的点均为偶点。由于有奇数个奇点,向外连出的边数一定是奇数条,因此存在矛盾,原结论成立。

P3440

流子题。看到 \(n\le 200\) 果断选择费用流,建模十分简单,直接暴力建边复杂度就是对的。

P3441

有点牛的结论题。考虑一条出现在最优方案中路径覆盖到的点的性质,发现一定是叶子到叶子。剥掉所有叶子之后这个性质依然成立。所以从叶子开始拓扑排序,每层点数和 \(2k\)\(min\) 加起来即可。

P3526

很牛的串串题。首先周期可以用 KMP 跳 border 求出。于是把限制转化为 \(S\)\(T\) 从结尾开始往前跳最长 border 的每个位置上的最长 border 都相同。

考虑递归构造。设 \(f(x)\) 表示长为 \(x\) 的前缀的答案。假设此时已经求出 \(f(fail(x))\),要求 \(f(x)\)。分类讨论:

  1. \(2fail(x)\ge x\),此时 \(f(x)\) 可以唯一确定。
  2. \(2fail(x)< x\),此时中间剩余的部分需要被构造。

首先对于第一种情况,我们证明 \(f(x)\) 一定合法,即不存在更长的 border。如果 \(f(x)\) 存在更长的 border,那么就存在一个更小的周期,且这个周期一定也在 \(f(fail(x))\) 中存在。然后 \(f(fail(x))\)\(S_{1,\cdots,fail(x)}\) 的所有周期相同,所以 \(f(x)\) 更长的这个 border 必定在 \(S_{1,\cdots,x}\) 中也是 border。这和 \(fail(x)\)\(S_{1,\cdots,x}\) 的最长 border 矛盾,因此 \(f(x)\) 一定合法。

对于第二种情况,我们要找到字典序最小的构造。我们声称中间部分一定会是 \(0^{len}\)\(0^{len-1}1\)。下面给出证明:

设新产生的 border 长为 \(y\)。如果 \(fail(x)+y>x\),说明新 border 和原 border 有交,可以仿照第一种情况来证明这种串唯一。

考虑 \(fail(x)+y\le x\) 的情况。此时只有中间串全 \(0\)\(f(fail(x))\)\(0\) 或中间串等于 \(f(fail(x))\) 两种。\(0^{len}\)\(0^{len-1}1\) 中必有一个不满足。

因此一定存在这样的构造合法。

P3443

首先考虑如果 \(t=0\),那么原问题等价于有向图欧拉回路,可以直接 dfs 求出路径。

现在给出限制:欧拉路径中必须存在连续的一段给定序列。等价于强制钦定走边的顺序,可以把原来的边删掉,加一条给定序列起始位置到终止位置的边。在走这条边时就相当于走了给定的序列。维护所有这样的修改,最后跑一边欧拉回路即可。

维护的时候可以使用双向链表存图,动态删边加边,用并查集和链表维护路径的重叠部分。最后跑并查集要判除掉孤立点后所有点是否和 \(1\) 弱连通。

P3444

首先一个合法方案一定是把一个方向(横向或纵向)的地耕完,于是我们可以钦定一个方向被用完。

假设横向的地耕完,我们贪心,模拟这个过程,发现不好处理的是左右走不了的时候上下用哪个。于是可以直接钦定上或下最终用了 \(k\) 个,再贪心去求另一个方向用的最小次数少即可。两个方向分别做一遍即可得出答案。时间复杂度 \(\mathcal O(nm)\)

posted @ 2026-07-27 18:14  Redolent  阅读(5)  评论(0)    收藏  举报