// 鼠标点击特效 //

杂题选做2

杂题选做2

P4298 祭祀

答案分为三部分:求出答案,构造反链,求出一个点是否可能出现在最长反链上。

求出答案

首先,最长反链的值和最小可重链覆盖是等价的。

我们熟知的网络流 24 题中有一道最小不可重链覆盖,想必大家都会。考虑可重链覆盖,相当于我们重新认为一条链不一定是连续的,只要前后两点有可以到达的关系即可,这样问题又转化为了不可重链覆盖。

为了达成这一点,我们只需要对原图求传递闭包,然后使用网络流 24 题中的方法求解。

构造反链

为了避免后面出现一些歧义,我们回顾不可重链覆盖的方法:

  • 将每一个点拆分为 xin,xout 。所有的 xin 看作二分图的左部,xout 看作二分图的右部。
  • 假设 i 可以直接或者间接到达 j ,则 (iout,jin) 之间连一条边。

答案为 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,所以这种情况不可能出现。

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

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

证明:

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

  2. 大小正确。令 A 表示最大独立集,B 表示构造出的反链。已经知道的是 |A|=2nm ,需要证明的是 |B|=nm

  • 一个下界:考虑 AB 意味着什么?xin 或者 xout 有一个不在 A 中的点的个数,肯定不超过 n 个。也就是说 |A||B|n ,进而 |B||A|n=nm

  • 一个上界:|B| 再大,不会比 nm 大。对于每一条匹配边,都会导致某一个 xin 或者 xout 没有出现在最大独立集中。

所以 |B|=nm

求出可能出现在最长反链中的点

暴力枚举某一个点 x 并且加入到最长反链中。那么我们就需要将原图中可以到达 x 或者被 x 到达的点删除,剩下的点构造最大反链,如果大小为 nm1 ,就说明 x 可能出现在最长反链中。

时间复杂度 O(n4)

CF2048G Kevin and Matrices

不可能出现:

min1in(max1jmai,j)<max1jm(min1inai,j).

所以题目要求的等价于:

min1in(max1jmai,j)=max1jm(min1inai,j).

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

g(x,y)=CnxCmy×v(nx)(my)×wx(my)×(vw+1)y(nx)

理由简单。

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

ans=x1y1g(x,y)(1)x+y2

=x1y1CnxCmy×v(nx)(my)×wx(my)×(vw+1)y(nx)×(1)x+y2

我们现在来求 y0 的情况,最后减去 y=0

x1Cnx(1)xy0Cmy×v(nx)(my)×wx(my)×(vw+1)y(nx)×(1)y

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

=x1Cnx(1)x(vnx×wx(vw+1)nx)m

单次求解 O(nlogm) 。枚举每一个可能的权值 w ,时间复杂度为 O(nvlogm)

QOJ8428 Partition into Teams

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

i=0nCn2iC2ii

但是这个组合公式没有明显的优化方案。注意到本题模数 p106 且为质数,启发我们使用卢卡斯定理优化。

进行数位dp ,设 fd,j,k 表示考虑到第 d 位,j 表示 2i 是否有进位,k 表示仅考虑 p 进制的前 d 位,i 是否比 n 大。转移只需要暴力枚举一个 [0,p) 之间的数填入第 d 位即可。

最终答案为 f60,0,0 。时间复杂度 O(plog2n)

QOJ7302 Walk of Length 6

题目要求求出非简单的 6 元环数量。我们直接枚举非简单 6 元环的全部形态:

  • 长度为2的链:直接枚举 O(n2)
  • 长度为3的链:枚举其中的某一条边,两一条边用度数计算 O(n2)
  • 长度为4的链:枚举中间那条边,用度数计算另外两条边。使用 bitset 去掉三元环的情况。时间复杂度 O(n3w)
  • 简单三元环:枚举其中某一条边,bitset计算可能的第三点的数量 O(n3w)
  • 简单四元环:枚举对角线上的两个点,bitset计算可能的另外两点的数量 O(n3w)
  • 大小为4的菊花图:枚举菊花图的根,然后用度数算。时间复杂度 O(n)
  • 简单四元环带小尾巴:枚举某一条对角线,钦定对角线上某个点具有小尾巴。其余方法和四元环一样,时间复杂度 O(n3w)
  • 简单四元环+对角线:枚举对角线,其余方法和四元环一样,时间复杂度 O(n3w)
  • 两个交集大小为 1 的三元环:先求出交点数量为 1,2 的情况,方法同简单三元环;去掉交点数量为 2 的情况,方法同简单四元环+对角线。时间复杂度 O(n3w)

发现每一种都可以在 O(n3w) 的时间复杂度内计算。

QOJ1277 Permutation

写一个爆搜或者凭直觉发现,如果一个排列 p 想要不合法其实非常困难。我们转而考虑那些不存在长度为 3 的等差序列的排列 p

考虑一个暴力:设 fi,s 表示填到序列的第 i 个元素,在第 i 个元素之前,s 内的数已经被填入了。那么我们可以枚举第 i 个元素可以填入的值,利用 s 判断是否合法:

  • 假设 ai=x ,如果存在两个元素 1y,zn ,使得 y+z=2xys,zs ,则说明存在一个等差序列。

现在获得了一个 O(n22n) 的做法。

考虑去除掉无用状态,速度有明显提升,但是依然无法通过 n50 的数据。我们考虑限制是从前往后越来越严格,所以我们倒着dp,并且去除无用状态即可通过。

QOJ4283 Power of XOR

首先,问题要求 popcountk 。因为 k 比较大,考虑求出 popcount=i 的集合数量。

经过一定的思考,发现本问题并不容易折半,考虑线性基。设线性基的大小为 m

如果 m 比较小,那么我们可以直接枚举集合的异或和,这只有 2m 中可能。我们容易做到 O(2m)

但是如果 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 个二进制位,仅可以从线性基中的某一个元素获取。我们可以状压另外 nm 个二进制位。具体状态如下:设 fi,j 表示在线性基中选取了 i 个元素,j 是仅考虑另外 nm 位的异或和。实际上,本质不同的 j 只有 2nm 个,所以这个做法的时间复杂度为 O(n22nm)

两种做法综合一下即可通过本题。

CF1383F Special Edges

根据本题的数据范围,本文认为 n,m 同阶。

动态修改 k 条边的流量,从最大流的角度好像很难做,但是如果从最小割的角度来看,发现只需要枚举 k 条边哪一条割,哪一条不割就可以了。

fs 表示集合 s 内的特殊边割掉,其余的不割,原图的最小割(不考虑 s 内边的代价)。如果有 f 数组,我们的询问可以做到 O(q2k)

如果直接暴力枚举删不删一条边,接下来暴力跑网络流,时间复杂度是 O(2knnV) 的,本题的数据极强无法通过。

这个做法的缺陷在于哪里呢?假设我们求出了 fs ,并且保留了 fs 残余网络的状态,我们需要求出 fsx 。对于原网络而言,改变的只有 x 这一条边而已,所以我们只需要退流就可以。时间复杂度被优化到了 O(2knV)

总体时间复杂度 O(2knV+nnV+q2k) ,需要卡常。

posted @   dan-da-dan  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示