// 鼠标点击特效 //

杂题选做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|\) 中。
  1. 不会出现某一条匹配边,两端都没有被加入到 \(s\) 。这相当于左部没有被dfs到,右部被dfs了。而右部作为匹配点,被dfs到无非是左部经过一条匹配边到达的,而现实是左部没有被dfs到。
  2. 不会出现某一条匹配边,两端都被加入到 \(s\) 。这相当于左部被dfs到,右部没有被dfs。但是当左部被dfs到的那个时刻,就会沿着匹配边去dfs到右部点,所以这不可能。
  • \(s\) 中的点可以覆盖到所有的边。假设存在某一条边,两端的节点都不在 \(s\) 中,也就是说,左部点没有被dfs到,右部点被dfs到了。分析一下,这种情况下,这条边只能是一条匹配边(不然这个左部点就会被dfs)。既然是一条匹配边,右部点是不可以作为dfs的起点的,仅可以通过相应左部点走匹配边到达,而这个左部点并没有被dfs,所以这种情况不可能出现。

接下来构造 最大独立集 ,其实就是最小点覆盖的补集。

最后构造 最长反链 。对于每一个节点,如果 \(x_in,x_out\) 都在最大独立集中,就加入到最长反链中。

证明:

  1. 是合法的反链:如果不合法,就存在两点 \(x,y\) ,使得 \(y_{in}\)\(x_{out}\) 之间有边。两点都被加入到最大独立集,意味着 \(x_{out},y_{in}\) 都不在最小点覆盖中。如果 \(y_{in},x_{out}\) 之间有边,那么最小点覆盖就不合法了。所以他们之间没有边。

  2. 大小正确。令 \(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

不可能出现:

\[\min_{1\le i\le n}\left(\max_{1\le j\le m}a_{i,j}\right)<\max_{1\le j\le m}\left(\min_{1\le i\le n}a_{i,j}\right). \]

所以题目要求的等价于:

\[\min_{1\le i\le n}\left(\max_{1\le j\le m}a_{i,j}\right)=\max_{1\le j\le m}\left(\min_{1\le i\le n}a_{i,j}\right). \]

枚举这个权值 \(w\) 。这个条件等价于至少某一行全部小于等于 \(w\) ,至少某一列全部大于等于 \(w\) 。令 \(f(x,y)\) 表示至少 \(x\) 行全部小于等于 \(w\) ,至少 \(y\) 列全部大于等于 \(w\) ,考虑 \(g\) 的计算:

\[g(x,y)=C_{n}^xC_{m}^y\times v^{(n-x)(m-y)}\times w^{x(m-y)}\times (v-w+1)^{y(n-x)} \]

理由简单。

我们只需要容斥求出答案:

\[ans=\sum_{x \geq 1}\sum_{y \geq 1}g(x,y)(-1)^{x+y-2} \]

\[=\sum_{x \geq 1}\sum_{y \geq 1}C_{n}^xC_{m}^y\times v^{(n-x)(m-y)}\times w^{x(m-y)}\times (v-w+1)^{y(n-x)}\times (-1)^{x+y-2} \]

我们现在来求 \(y \geq 0\) 的情况,最后减去 \(y=0\)

\[\sum_{x \geq 1}C_{n}^x(-1)^x\sum_{y \geq 0}C_{m}^y\times v^{(n-x)(m-y)}\times w^{x(m-y)}\times (v-w+1)^{y(n-x)}\times (-1)^{y} \]

后面部分可以使用二项式定理优化:

\[=\sum_{x \geq 1}C_{n}^x(-1)^x(v^{n-x}\times w^{x}-(v-w+1)^{n-x})^m \]

单次求解 \(O(n \log m)\) 。枚举每一个可能的权值 \(w\) ,时间复杂度为 \(O(nv \log m)\)

QOJ8428 Partition into Teams

这个问题除了平局之外是具有对称性的,我们肯定是求平局的数量更好求。容易知道平局的数量为:

\[\sum_{i=0}^n C_{n}^{2i}C_{2i}^i \]

但是这个组合公式没有明显的优化方案。注意到本题模数 \(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)\) ,需要卡常。

posted @ 2024-12-19 16:59  dan-da-dan  阅读(47)  评论(0)    收藏  举报