邪恶波兰题选做
波兰题,太邪恶了
其实都是很好的题。
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)\)。分类讨论:
- \(2fail(x)\ge x\),此时 \(f(x)\) 可以唯一确定。
- \(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)\)。

浙公网安备 33010602011771号