出题人题解 Part II(E-G)
E 奇环
题解
二分图,鸽巢原理。
没有奇环的图被称为二分图。
假设一个图没有奇环,那么将它视为二分图,并分为左部右部,假设左部 n1 个点,右部 n2 个点,那么它最多有 n1×n2 条边。
若题目中给定的图没有奇环,应满足:
- n1+n2=n
- 2n×(n−1)−m≤n1×n2
结合基本不等式,解得 m≥4n2−2n,再结合题中的数据范围,当 n≥896 时,由于 m≤2×105,该不等式无法满足,即图中必然存在奇环。
否则,当 n≤895 时,使用一个经典的 DFS/BFS 染色算法即可在 O(n+m) 的时间内完成奇环的判定。
代码
代码 - XLor Paste
F 座位
题解
有两种做法,第一种做法基于期望的线性性质,第二种做法基于动态规划。
做法 1:
首先需要观察一下这件事情的规律,我们考虑第 i 个人进来时的情况:
- 前 i−1 个人坐在了前 i−1 个椅子上,此时 i 可选的位置是 i 和 i+1。
- 第 i−1 个人坐在了第 i 个位置上,此时 i 可选的位置是 1→i−1 中的某个位置和第 i+1 个位置。
不论是以上哪一种情况,如果第 i 个人不选择坐在第 i+1 个位置上,那么 i 坐下之后前 i 个人就将坐在前 i 个椅子上,这件事发生的概率是 0.5。
考虑第 i(2≤i<n) 个人坐在第 i 个位置上的概率,是前 i−1 个人坐在前 i−1 个位置上的概率,乘上,第 i 个人选择第 i 个位置的概率,等于 0.25。i=1、n 情况特殊,特别考虑,它们坐在自己位置上的概率是 0.5。
根据期望的线性性质,答案 E(x)=i=1∑nE(xi),其中 E(xi) 表示第 i 个人坐在第 i 个椅子上的数量期望。
因此答案为即 21+4n−2+21,n=1 时特判输出 1。
补充说明:可能有读者会疑惑为什么 E(xi) 表示第 i 个人坐在第 i 个椅子上的数量期望,却在数值上等于第 i 个人坐在第 i 个椅子上的概率,因为:
E(xi)=1×(第i个人坐在第i个椅子上的概率)+0×(第i个人不坐在第i个椅子上的概率)=(第i个人坐在第i个椅子上的概率)
做法 2:

考虑动态规划,dpi 表示 n=i 时的答案。
考虑 dpi 从何转移而来,一个经典的想法是:枚举 i 所在的环的大小 j。
因为 i 是最后一个人,所以它的位置是唯一确定的,不失一般性考虑 j=2 的情况:
如果 j=2,那么说明第 i−2 个人走进来坐在了 [1,i] 某个位置上,终止了它所在的环,这件事的概率是 21。第 i−1 个人走进来坐在了第 i 个位置上,这件事发生的概率也是 21。这样,第 i 个人就坐在了第 i−1 个位置上,与第 i−1 个人形成了大小为 j=2 的环。
我们得到了一个转移 dpi←41dpi−2。
类似地把 j=1→i−1 都考虑进来,就会得到 dpi=21(1+dpi−1)+j=2∑i−12j1dpi−j。
观察这个和式,dpi 可以从 dpi−1 O(1) 地转移过来,因此做到了线性的复杂度。
具体地,会推出当 i≥2 时,dpi=dpi−1+41。
补充说明:可能有读者会疑惑上式如何化简,如下给出推导:

G
题解
本题在赛时出现了比原题解做法更优秀的 DP 做法,于是先放上 DP 做法。
做法1:
对于操作,我们会发现如果交换两个 0 或者交换两个 1 是没有意义的,因此一定是交换 01 或者 10,也可以视为某一个 1 在 01 序列中移动了一个单位距离。
转换一下题意,考虑将所有 1 分配到 n 个位置中的若干个位置,使得分配的位置不存在相邻的情况。
那么可以考虑如下 DP,fi,j,0/1 表示考虑了前 i 个位置已经放了 j 个 1,第 i 个位置放的是 0/1。
那么考虑 DP 的转移:第 j 个 1 是否放在第 i 个位置(记第 j 个 1 的位置为 posj)。
- 放:则从第 j 个 1 所在的位置移动到 i,需要的交换次数为 ∣posj−i∣。有 fi,j,1=fi−1,j−1,0+∣posj−i∣。
- 不放:则有 fi,j,0=min(fi−1,j,0,fi−1,j,1)。
复杂度为 O(n2)。
做法2:
费用流。
换一个视角看这个问题,把 0 看成水,1 看成装水的容器壁(先不考虑最左、最右边的 0)如下图表示 10011001 的视角。

那么不存在两个相邻的 1 即可被视为不存在某个容器里面没有水(蓝色的 0 表示水,黑色的 1 表示容器壁)。
对于操作,我们会发现如果交换两个 0 或者交换两个 1 是没有意义的,因此一定是交换 01 或者 10。在这个视角下,交换 01 或者 10 即将一个水从一个容器,移动到一个相邻的容器。
对此我们建立费用流模型,每个容器视为图的一个节点,设第 i 个容器初始时有 vi 的水,总共有 V 的水(即 01 序列总共有 V 个 0)。
- 超级源点指向第 i 个容器连一条容量为 vi、单位费用为 0 的边。
- 第 i 个容器指向超级汇点,连一条容量为 1、单位费用为 0 的边。
- 第 i 个容器分别向第 i−1, i+1 个容器连一条容量为 V、单位费用为 1 的边。
这样,在最大流基础上得到的最小费用,就是本题的答案。
若 SSP 算法求解,使用 Bellman-Ford 算法寻找最短路,那么可以得到一个最坏复杂度 O(nmf),在本题为 O(n3),但远远跑不满。
代码
代码 - XLor Paste