杂题选做2
杂题选做2
P4298 祭祀
答案分为三部分:求出答案,构造反链,求出一个点是否可能出现在最长反链上。
求出答案
首先,最长反链的值和最小可重链覆盖是等价的。
我们熟知的网络流 \(24\) 题中有一道最小不可重链覆盖,想必大家都会。考虑可重链覆盖,相当于我们重新认为一条链不一定是连续的,只要前后两点有可以到达的关系即可,这样问题又转化为了不可重链覆盖。
为了达成这一点,我们只需要对原图求传递闭包,然后使用网络流 \(24\) 题中的方法求解。
构造反链
为了避免后面出现一些歧义,我们回顾不可重链覆盖的方法:
- 将每一个点拆分为 \(x_{in},x_{out}\) 。所有的 \(x_{in}\) 看作二分图的左部,\(x_{out}\) 看作二分图的右部。
- 假设 \(i\) 可以直接或者间接到达 \(j\) ,则 \((i_{out},j_{in})\) 之间连一条边。
答案为 \(n\) 减去最大匹配。
减去最大匹配的原因可以理解为,一开始每一个节点都是一个独立的链,而一条匹配边相当于对于两条链合并。
为了构造反链,我们需要先构造 最小点覆盖
假设求出了最大匹配,知道了哪些节点被匹配了。接下来从右部点中没有被匹配的那些点出发,开始dfs,但是只允许经过非匹配边到达左部点;如果dfs当前在一个左部点,那么只允许经过匹配边到达右部点。
最终取左部被dfs到的点,右部点没有被dfs到的点,这个就是最小点覆盖集合 \(s\)。
证明:
- \(|s|=m\) 。明确一点,就是 \(s\) 中的节点都是被匹配的节点。其实 \(|s|=m\) 的原因就是每一条匹配边,都有恰好一个端点存在与 \(|s|\) 中。
- 不会出现某一条匹配边,两端都没有被加入到 \(s\) 。这相当于左部没有被dfs到,右部被dfs了。而右部作为匹配点,被dfs到无非是左部经过一条匹配边到达的,而现实是左部没有被dfs到。
- 不会出现某一条匹配边,两端都被加入到 \(s\) 。这相当于左部被dfs到,右部没有被dfs。但是当左部被dfs到的那个时刻,就会沿着匹配边去dfs到右部点,所以这不可能。
- \(s\) 中的点可以覆盖到所有的边。假设存在某一条边,两端的节点都不在 \(s\) 中,也就是说,左部点没有被dfs到,右部点被dfs到了。分析一下,这种情况下,这条边只能是一条匹配边(不然这个左部点就会被dfs)。既然是一条匹配边,右部点是不可以作为dfs的起点的,仅可以通过相应左部点走匹配边到达,而这个左部点并没有被dfs,所以这种情况不可能出现。
接下来构造 最大独立集 ,其实就是最小点覆盖的补集。
最后构造 最长反链 。对于每一个节点,如果 \(x_in,x_out\) 都在最大独立集中,就加入到最长反链中。
证明:
-
是合法的反链:如果不合法,就存在两点 \(x,y\) ,使得 \(y_{in}\) 和 \(x_{out}\) 之间有边。两点都被加入到最大独立集,意味着 \(x_{out},y_{in}\) 都不在最小点覆盖中。如果 \(y_{in},x_{out}\) 之间有边,那么最小点覆盖就不合法了。所以他们之间没有边。
-
大小正确。令 \(A\) 表示最大独立集,\(B\) 表示构造出的反链。已经知道的是 \(|A|=2n-m\) ,需要证明的是 \(|B|=n-m\) 。
-
一个下界:考虑 \(A-B\) 意味着什么?\(x_{in}\) 或者 \(x_{out}\) 有一个不在 \(A\) 中的点的个数,肯定不超过 \(n\) 个。也就是说 \(|A|-|B| \leq n\) ,进而 \(|B| \geq |A|-n=n-m\) 。
-
一个上界:\(|B|\) 再大,不会比 \(n-m\) 大。对于每一条匹配边,都会导致某一个 \(x_{in}\) 或者 \(x_{out}\) 没有出现在最大独立集中。
所以 \(|B|=n-m\) 。
求出可能出现在最长反链中的点
暴力枚举某一个点 \(x\) 并且加入到最长反链中。那么我们就需要将原图中可以到达 \(x\) 或者被 \(x\) 到达的点删除,剩下的点构造最大反链,如果大小为 \(n-m-1\) ,就说明 \(x\) 可能出现在最长反链中。
时间复杂度 \(O(n^4)\) 。
CF2048G Kevin and Matrices
不可能出现:
所以题目要求的等价于:
枚举这个权值 \(w\) 。这个条件等价于至少某一行全部小于等于 \(w\) ,至少某一列全部大于等于 \(w\) 。令 \(f(x,y)\) 表示至少 \(x\) 行全部小于等于 \(w\) ,至少 \(y\) 列全部大于等于 \(w\) ,考虑 \(g\) 的计算:
理由简单。
我们只需要容斥求出答案:
我们现在来求 \(y \geq 0\) 的情况,最后减去 \(y=0\) 。
后面部分可以使用二项式定理优化:
单次求解 \(O(n \log m)\) 。枚举每一个可能的权值 \(w\) ,时间复杂度为 \(O(nv \log m)\) 。
QOJ8428 Partition into Teams
这个问题除了平局之外是具有对称性的,我们肯定是求平局的数量更好求。容易知道平局的数量为:
但是这个组合公式没有明显的优化方案。注意到本题模数 \(p \leq 10^6\) 且为质数,启发我们使用卢卡斯定理优化。
进行数位dp ,设 \(f_{d,j,k}\) 表示考虑到第 \(d\) 位,\(j\) 表示 \(2i\) 是否有进位,\(k\) 表示仅考虑 \(p\) 进制的前 \(d\) 位,\(i\) 是否比 \(n\) 大。转移只需要暴力枚举一个 \([0,p)\) 之间的数填入第 \(d\) 位即可。
最终答案为 \(f_{60,0,0}\) 。时间复杂度 \(O(p \log_2 n)\) 。
QOJ7302 Walk of Length 6
题目要求求出非简单的 \(6\) 元环数量。我们直接枚举非简单 \(6\) 元环的全部形态:
- 长度为2的链:直接枚举 \(O(n^2)\) 。
- 长度为3的链:枚举其中的某一条边,两一条边用度数计算 \(O(n^2)\) 。
- 长度为4的链:枚举中间那条边,用度数计算另外两条边。使用 bitset 去掉三元环的情况。时间复杂度 \(O(\frac{n^3}{w})\) 。
- 简单三元环:枚举其中某一条边,bitset计算可能的第三点的数量 \(O(\frac{n^3}{w})\) 。
- 简单四元环:枚举对角线上的两个点,bitset计算可能的另外两点的数量 \(O(\frac{n^3}{w})\) 。
- 大小为4的菊花图:枚举菊花图的根,然后用度数算。时间复杂度 \(O(n)\) 。
- 简单四元环带小尾巴:枚举某一条对角线,钦定对角线上某个点具有小尾巴。其余方法和四元环一样,时间复杂度 \(O(\frac{n^3}{w})\) 。
- 简单四元环+对角线:枚举对角线,其余方法和四元环一样,时间复杂度 \(O( \frac{n^3}{w})\) 。
- 两个交集大小为 \(1\) 的三元环:先求出交点数量为 \(1,2\) 的情况,方法同简单三元环;去掉交点数量为 \(2\) 的情况,方法同简单四元环+对角线。时间复杂度 \(O(\frac{n^3}{w})\) 。
发现每一种都可以在 \(O(\dfrac{n^3}{w})\) 的时间复杂度内计算。
QOJ1277 Permutation
写一个爆搜或者凭直觉发现,如果一个排列 \(p\) 想要不合法其实非常困难。我们转而考虑那些不存在长度为 \(3\) 的等差序列的排列 \(p\) 。
考虑一个暴力:设 \(f_{i,s}\) 表示填到序列的第 \(i\) 个元素,在第 \(i\) 个元素之前,\(s\) 内的数已经被填入了。那么我们可以枚举第 \(i\) 个元素可以填入的值,利用 \(s\) 判断是否合法:
- 假设 \(a_i=x\) ,如果存在两个元素 \(1 \leq y,z \leq n\) ,使得 \(y+z=2x\) 且 \(y \in s ,z \notin s\) ,则说明存在一个等差序列。
现在获得了一个 \(O(n^2 2^n)\) 的做法。
考虑去除掉无用状态,速度有明显提升,但是依然无法通过 \(n \leq 50\) 的数据。我们考虑限制是从前往后越来越严格,所以我们倒着dp,并且去除无用状态即可通过。
QOJ4283 Power of XOR
首先,问题要求 \(\text{popcount}^k\) 。因为 \(k\) 比较大,考虑求出 \(\text{popcount}=i\) 的集合数量。
经过一定的思考,发现本问题并不容易折半,考虑线性基。设线性基的大小为 \(m\) 。
如果 \(m\) 比较小,那么我们可以直接枚举集合的异或和,这只有 \(2^m\) 中可能。我们容易做到 \(O(2^m)\) 。
但是如果 \(m\) 比较大,该怎么办?我们可以通过“线性基求异或第 \(k\) 大”的相同方式构造一组特别的线性基,这不会影响问题的答案。构造方式如下:
for(int i=0;i<=62;i++)
for(int j=i-1;j>=0;j--)
if(p[i]>>j&1) p[i]^=p[j];
那么这样的线性基有什么特点呢?有 \(m\) 个二进制位,仅可以从线性基中的某一个元素获取。我们可以状压另外 \(n-m\) 个二进制位。具体状态如下:设 \(f_{i,j}\) 表示在线性基中选取了 \(i\) 个元素,\(j\) 是仅考虑另外 \(n-m\) 位的异或和。实际上,本质不同的 \(j\) 只有 \(2^{n-m}\) 个,所以这个做法的时间复杂度为 \(O(n^22^{n-m})\) 。
两种做法综合一下即可通过本题。
CF1383F Special Edges
根据本题的数据范围,本文认为 \(n,m\) 同阶。
动态修改 \(k\) 条边的流量,从最大流的角度好像很难做,但是如果从最小割的角度来看,发现只需要枚举 \(k\) 条边哪一条割,哪一条不割就可以了。
设 \(f_s\) 表示集合 \(s\) 内的特殊边割掉,其余的不割,原图的最小割(不考虑 \(s\) 内边的代价)。如果有 \(f\) 数组,我们的询问可以做到 \(O(q2^k)\) 。
如果直接暴力枚举删不删一条边,接下来暴力跑网络流,时间复杂度是 \(O(2^kn\sqrt{nV})\) 的,本题的数据极强无法通过。
这个做法的缺陷在于哪里呢?假设我们求出了 \(f_s\) ,并且保留了 \(f_s\) 残余网络的状态,我们需要求出 \(f_{s\cup x}\) 。对于原网络而言,改变的只有 \(x\) 这一条边而已,所以我们只需要退流就可以。时间复杂度被优化到了 \(O(2^knV)\) 。
总体时间复杂度 \(O(2^knV+n\sqrt{nV}+q2^k)\) ,需要卡常。

浙公网安备 33010602011771号