杂题选做-13
#121 P5295
考虑一个无向图合法的一个必要条件:其任意导出子图 \((V,E)\) 满足 \(|E| \le 2|V|-2\)。因为无环等于是森林。
或许它同时是一个充分条件?考虑归纳法:假设已经证明了 \(|V|-1\) 时,结论成立;现在往其中加入一个点 \(u\),不妨钦定其为度数最小的点。
那么有 \(1 \le d_u \le 3\),不然 \(\sum d_i \ge 4|V|,|E|\ge 2|V|\)。如果 \(d_u \le 2\),那么显然成立,将一条边加入一个森林,另一条(如果有)加入另一个即可。
如果 \(d_u=3\),记与 \(u\) 相邻的点为 \(v_1,v_2,v_3\)。那么去掉 \(u\) 及其连边后的图 \(G\) 有 \(2|V| -2>|E|\)。考虑此时 \((V,E)\) 的三个导出子图 \(G_1,G_2,G_3\)。其中 \(G_i\) 不包含 \((u,v_i)\) 但是包含其他两个点。那么在这三个导出子图中至少有一个子图满足 \(|E_i| < 2|V|-2\)。
这有一个结论:对于 \(H_1(V_1,E_1),H_2(V_2,E_2)\) 满足 \(|E_1|=2|V_1|-2,|E_2|=2|V_2|-2\),那么对于 \(H_1\cap H_2(V_1',E_1'),H_1 \cup H_2(V_2',E_2')\) 有 \(|E_1'|=2|V_1'|-2,|E_2'|=2|V_2'|-2\)。因为”交加并等于和“,所以如果其中一个没有达到上界,那么另一个就要超过上界。
假如三个导出子图都满足 \(|E|=2|V|-2\),那么它们的并也满足 \(|E|=2|V|-2\),但它们的并是 \(G\),矛盾!故原命题得证。
那么不符令 \(G_1\) 不满足 \(|E|=2|V|-2\),那么可以往其中加入 \((u,v_1)\)。然后考虑在加入 \(u\) 前往 \(G\) 中加入 \((v_2,v_3)\),显然此时 \(G\) 仍然合法。对于包含 \((v_2,v_3)\) 的森林,显然去掉 \((v_2,v_3)\),再加入 \((u,v_2)(u,v_3)\) 后还是合法的。
于是最开始的条件是原图合法的充要条件。
那么将其变形也就是 \(\max (|E|-2|V|) \le -2\)。这不就是最大权闭合子图吗,网络流典题。
但是题目要求子图非空,于是钦定一个点被选,利用退流技巧可以做到 \(O(nm)\)。
#122 CF1874F
考虑容斥。
在 \(\sum m_i-i+1\) 个区间中钦定若干区间一定不合法,然后对应方案数乘上 \(-1\) 的区间个数加一次方即可。
如果任意两个区间都无交很好做,但是存在区间相交。观察一下,容易发现如果 \(l_1<l_2<r_1<r_2\) 满足 \([l_1,r_1],[l_2,r_2]\) 均不合法,那么 \([l_1,l_2-1]\) 也不合法。
有一个经典 Trick 是若当前钦定的区间集合中存在集合有交,那么取出 \(l_1\) 最小的两个区间 \([l_1,r_1],[l_2,r_2]\)。若此时集合中存在 \([l_1,l_2-1]\),那么删除它;否则加入它。那么此时就将所有有区间相交的集合两两匹配,且容斥系数相反,贡献抵消。
因此只需要统计不存在相交区间的集合即可(此处不认为包含属于相交)。此时依据区间之间的包含关系可以构建一个类似树的结构,对这个树进行 dp。
记 \(f_{l,r}\) 表示钦定 \([l,r]\) 非法时带容斥系数的方案数,\(g_{l,r,x}\) 表示 \([l,r]\) 内有 \(x\) 个位置没有被钦定的区间覆盖的带容斥系数的方案数。枚举 \(l\),有:
解释:
-
第一个式子:先钦定最右边的位置是新的空位,这里的方案数就是 \(g_{l,r-1,x-1}\);同时也可能这个状态是包含别人得到的。
-
第二个式子:主要想讲一下 \(x!\) 的系数的来由,因为有 \(x\) 个位置是没有被覆盖的,所以在值域上也有 \(x\) 个数没有被钦定的(钦定的数都被区间覆盖)。
-
第三个式子:显然,在上述过程中并没有计算整个区间非法的贡献。
时间复杂度 \(O(n^4)\),通过合理的枚举可以拥有极小常数。
#123 P3175
首先做一步转化:记 \(a_i\) 表示当前第 \(i\) 个二进制上的值,\(\max (S)=\max \limits_{i\in S}a_i\),类似有 \(\min(S)\) 的定义,那么题目本质就是要求 \(E(\min(U))\)。
这不太好求,但是因为我们都学过 Max-Min 容斥,并且也知道它在期望意义下仍旧成立,因此上述式子可以转化为:
接下来问题转化为:怎么求 \(E(\max(S))\),即第一次出现 \(S\) 中二进制位被覆盖的期望时间。
有一个东西叫离散随机变量,对于离散型随机变量 \(x\) 其满足 \(P(x=k)=(1-p)^{k-1}p\),并且有一个重要性质(离散随机变量的集合分布) \(E(x)=\dfrac{1}{k}\)。因为 \(P(\max(S)=k)=P(C_US)^{k-1}(1-P(C_US))\),即前 \(k-1\) 选到的数都在 \(S\) 的补集内,那么这说 \(\max(S)\) 是离散随机变量。这时候就需要计算 \(P(S)\) 即可。
显然,只需要不选到 \(P\) 的补集即可,也就是:
记 \(P'(S)=\sum\limits_{T\subseteq S} P(T)\),做一个高位前缀和或做或卷积的 FWT 即可。
#124 P5339
首先,考虑一下 \(20pts\) 的做法:因为 \(n\le \min(a,b,c,d)\),所以等价于这 \(n\) 个人的喜好是完全随机的,那么不妨进行一次二项式反演。记 \(f_i\) 表示钦定出现了 \(i\) 次 ctrl 的方案数,\(g_{i,j}\) 表示选出 \(n\) 个人且钦定有 \(i\) 个位置作为 ctrl 的结尾的方案数,;那么 \(f_i=g_{n,i}4^{n-4i}\),\(g_{i,j}=g_{i-1,j}+g_{i-4,j-1}\),然后不难发现 \(g_{n,i}=\binom{n-3i}{i}\),然后然后进行二项式反演即可。
再考虑正解。注意到上面的算法不能用的最大阻碍就是 \(4^{n-4i}\) 的系数不能再用了。那么不妨 dp 求一下,记 \(dp_{i,j}\) 表示考虑了前 \(i\) 种数,且已经放了 \(j\) 个数的方案数。枚举钦定出现了 \(x\) 次 ctrl,且第 \(i\) 种数有 \(c_i\) 个,那么有:
时间复杂度为 \(O(n^3)\)。
考虑一个更快的算法。注意到瓶颈主要在求出 dp 数组,考虑优化:
注意到这本质上就是在选出 \(4\) 个不交集合使得它们的并大小为 \(n-4x\),这比不就是 EGF 做的事情吗。所以对于每一种数先求出其 \(EGF\),也就是 \(F(x)=\sum_{i=0}\dfrac{x^i}{i!}\),然后做和卷积后乘上 \((n-4x)!\) 即可。
时间复杂度为 \(O(n^2\log n)\)。
#125 P10717
不妨先考虑 \(k=1\) 的部分分。记 \(f_{u,0/1/2}\) 表示考虑了 \(u\) 的子树,并且 "\(u\) 子树内没有点初始被激活" / “ \(u\) 子树内有恰好一个点初始被激活去且钦定子树外没有被激活的点” / “ \(u\) 子树内有恰好一个初始激活的点,且钦定子树外有初始被激活的点” 时的期望权值。
注意到子树内有多个点初始被激活的情况要和只有一个点被激活的情况区分,因此新开一个状态 \(3\) 表示 " \(u\) 子树内有至少两个初始被激活的点"(只在转移时使用)。记 \(g_{0/1/2/3}\) 表示对应状态下子树信息已经合并了的子树信息。记 \((a,b) \rightarrow c\),表示 \(g_af_{v,b} \rightarrow g_b\),那么有转移:
-
\((0,0) \rightarrow 0\);
-
\((0,1),(1,0) \rightarrow 1\);
-
\((0,2),(2,0) \rightarrow 2\);
-
\((2,2),(3,0/2)\rightarrow3\);
接下来考虑 \(u\) 初始时的激活情况:
-
如果 \(u\) 初始未被激活:那么不影响状态,\(g\) 的对应状态直接乘概率贡献到 \(f\) 即可。
-
如果 \(u\) 初始被激活:那么除了 \(1\) 状态不能转移外,其他状态均可以乘概率贡献到 \(f_{u,3}\)。为什么 \(0\) 也可以?因为 \(3\) 状态本质是要确定 \(u\) 被激活的,而此时 \(u\) 已经被激活了,满足条件,因此可以贡献。
那么将 \(a_{u,0}\) 乘到 \(0,1\) 状态,将 \(a_{u,1}\) 乘到 \({2,3}\) 状态,然后将 \(3\) 状态的值加到 \(1,2\) 状态上即可(因为此时子树外有没有点均可)。
时间复杂度 \(O(n)\)。
注意到状态其实可以扩展,同时存下多次操作的状态时,不同操作的状态互不影响,所以可以直接将 \(f\) 的第二维变成 \(S\),即 \(\{0,1,2,3\}^k\)。那么此时时间复杂度为 \(O(n(8^k+k4^k))\),实现良好有 \(75\) 分。
注意到 \(3\) 状态的转移最多,不妨从这里入手。一个 Trick:考虑一个类高维前缀和的过程,因为 \(3\) 状态的值可以由 \(0/2/3\) 状态的值减去 \(0/2\) 状态的值计算(因为转移到 \(3\) 状态的值一定从 \(0,2\) 转移过来),因此不妨在转移前就先将 \(v\) 的 \(0/2\) 状态的值都加到 \(3\) 上,然后在转移时只做转移到 \(0/1/2\) 状态的转移和 \((3,3) \rightarrow 3\),转移完后就将 \(3\) 状态的值减去 \(0/2\) 状态的值。
然后对于枚举 \(u\) 的初始操作状态和 \(3\) 对 \(1,2\) 状态的贡献可以类似处理。
单次转移时间复杂度降为 \(O(6^k)\),实际操作时可以预处理转移的下标。类高维前缀和过程的时间复杂度为 \(O(k4^k)\),综上时间复杂度为 \(O(n(6^k+k4^k))\)。
#126 P12264
首先,注意到 \(C\) 和 \(B\) 在一个匹配中的相对顺序是固定的,这比较好计数,但是 \(A\) 不是,比较棘手。但是如果将 \(AAA\) 划分为前后两个部分,那么 \(A\) 就可以被分为 \(A_l\) 和 \(A_r\) 两种,前者匹配 \(AB\),后者匹配 \(CA\),\(AAA\) 的匹配变成 \(A_lA_rA_r\)。
这类匹配问题中不妨将前面的元素视为左括号,后面的元素视为右括号,那么一个匹配其实就是删去一个合法括号序列。本题中将 \(A_l,C,A_r,B\) 分别视为两个左括号,一个左括号,一个右括号,两个右括号。那么序列对应的括号序列是合法括号序列是序列合法的必要不充分条件,因为需要钦定在一个匹配中,代表左括号或右括号的元素是同一种元素。
为了使上述条件变成充要条件,规定:单括号匹配优先于双括号匹配。于是就有匹配优先度:\(A_lB>A_lA_rA_r/CCB>CA_r\)。
此时就可以 dp 了。首先一定要记录当前已经考虑了多少个字符,且剩余多少个 \(A_l\) 和 \(C\),此时已经有 \(O(n^3)\) 的状态了。此时还需要增加一些常数维:
-
需要记录当前 \(A\) 是 \(A_r\) 还是 \(A_l\)。
-
如果出现了 \(A_r\),那么就会出现一个情况:显然此时应该优先匹配 \(A_lA_r\),但是如果此时出现了一个 \(B\),因为要优先匹配 \(A_lB\),所以 可能 \(A_r\) 就会参与到 \(CA_r\) 的匹配中,这个反悔过程是需要体现到状态里的。再注意到如果需要反悔连续两次,那么此时存在两个 \(C\),那么完全可以匹配 \(CCB\),而不是取反悔。这样就可以通过一个大小为 \(3\) 的状态表示“没有 \(A_lA_r\) 结构”,“有不可反悔的 \(A_lA_r\) 结构”“有可以反悔的 \(A_lA_r\) 结构”。
时间复杂度为 \(O(n^3)\)。
#127 P11620
一个 Trick:序列 \(\{a_n\}\) 的线性基和序列 \(b_i=a_{i-1}\oplus a_i\) 并上 \(a_1\) 的线性基相同。
那么经过不妨对原序列的异或差分序列建一个线段树,每一个节点维护区间内的线性基,然后修改变成单点修改,实现方法是在叶子处重构,询问也就是线性基的基本应用了。然后还需要维护一个树状数组求出 \(a_i\) 的值。
合并两个线性基的时间复杂度为 \(O(\log^2V)\),实现是直接把一个线性基中的数插入另一个线性基。因此时间复杂度为 \(O(n\log n\log^2 V)\)。
#128 AGC001E
首先,不难发现题目就是要求:
那么考虑 \(\binom{A_i+B_i+A_j+B_j}{A_i+A_j}\) 的组合意义,就是在格路上从 \((0,0)\) 走到 \((A_i+A_j,B_i+B_j)\) 的方案数。不妨平移一下,从 \((-A_i,-B_i)\) 走到 \((A_j,B_j)\)。这个事情显然是可以 dp 的,就是先令 \(dp_{-A_i,-B_i} \leftarrow 1\),然后平凡转移,答案就是 \(dp_{A_j,B_j}\)。
不妨扩展一下,先对每一个 \(i\) 做一次上述初始化,然后做一次 dp,接下来对每一个 \(i\) 统计答案之和。此时就得到了答案的第一部分,第二部分计算是平凡的。
时间复杂度为 \(O(V^2+n)\)。
#129 P6478
二项式反演简单题。
用二项式反演把恰好转化为钦定。那么现在只需要求钦定 \(i\) 次非平局的方案数即可。
记 \(f_{u,i}\) 表示考虑了 \(u\) 及其子树,钦定了 \(i\) 次非平局的情况。那么转移是平凡的树上背包,然后需要额外统计一次 \(u\) 点和其子树内一点被钦定的情况,转移系数就是子树内没有被钦定的节点数量。
时间复杂度为 \(O(n^2)\)。
#130 P10068
不妨先考虑 \(|h_i|\) 互异的部分分。
Observation I:正负性只与移动距离奇偶性相关。
Observation II:最终的序列的绝对值一定是先(非严格)递减后(非严格)递增。
那么记 \(f_{i,0/1}\) 表示已经考虑到绝对值第 \(i\) 大的元素,且已经有偶数/奇数个元素被安排到左侧的最小操作次数。安排一个数的代价就是以它为较大值或较小值的逆序对数量。
考虑 \(|h_i| \le 1\) 的部分分。
Trick:提前给偶数位的元素翻转正负性,那么操作变为平凡交换。最后将偶数位的元素正负性再翻转即可。
那么只需要枚举最终序列里有正数和负数数量,然后考虑 \(-1,1\) 对 \(0\) 的贡献和 \(1,-1\) 内部的贡献。第一部分就是 \(1\) 或 \(-1\) 左右侧 \(0\) 的个数(取决于移动方向),第二部分就是初末位置的绝对值之差。
考虑正解。
显然 \(\text{subtask I}+\text{subtask II}=\text{solution}\)。
在枚举绝对值时把 \(-x\) 当成 \(-1\),把 \(x\) 当成 \(1\),绝对值小于 \(x\) 的当成 \(0\),其他的已经在左右两侧了,不需要考虑,接下来用第二种做法做即可。
时间复杂度为 \(O(n\log n)\)。

浙公网安备 33010602011771号