MOCK NOIP 20221020 日志

感冒咳嗽,头实在是太晕了,打完前两题和后两题的暴力之后跑去睡了会觉。结果考得还行。

一句话题解

A – 破坏

简单的 O(m2k)\newcommand{\bigO}{\operatorname{O}}\bigO(m2^k) DP。记录每个节点的路径数奇偶性考虑是否翻转即可。

B – 共识

std::bitset 写的暴力大家都会。不过如果你胆子大些,不判断是否为部分分数据范围直接提交(加入随机化的)暴力,将喜提 100 pts\text{100 pts}

命题:现有一个由 2n2n 个元素构成的集合,保证 2n2\mid n。有 n+1n+1 个大小恰为 nn 的子集 S1,,Sn+1S_1,\cdots,S_{n+1}。则至少存在 n/2n/2 对无序对 (i,j),ij,i,j[1,n+1](i,j),i\neq j, i,j\in[1,n+1],使得 SiSjn/2|S_i\cap S_j|\geq n/2

证明(引自宋佳兴学长):记元素 p,p{1,,2n}p,p\in\{1,\cdots,2n\} 在所有子集中出现的次数为 cnt(p)\newcommand{\cnt}{\operatorname{cnt}}\cnt(p)。则显然有“所有子集两两之交的大小” i=1nj=i+1n+1SiSj=p=12n(cnt(p)2)\sum_{i=1}^{n}\sum_{j=i+1}^{n+1}|S_i\cap S_j|=\sum_{p=1}^{2n}\binom{\cnt(p)}{2}

考虑计算该式最小为何。不妨先考虑 (ab)+(nab)\binom{a}{b}+\binom{n-a}{b} 在何时取最小值。

引理(ab)+(nab),bn,a0,an\binom{a}{b}+\binom{n-a}{b}, b\leq n, a\geq 0, a\leq na=n/2a=\lfloor n/2\rfloor 处取最小值。

引理的证明:将 nan-a 记作 cc。原式 =1b!(ab+cb)=\frac{1}{b!}(a^{\underline{b}}+c^{\underline{b}})。考虑当 a=a1,c=c+1a’=a-1,c’=c+1 时该式如何变化。有 (ab+cb)(ab+cb)=a(a1)(ab+1)(a1)(a2)(ab)+c(c1)(cb+1)(c+1)c(cb+2)=(a1)(a2)(ab+1)[a(ab)]+c(c1)(cb+2)[(c+1)(cb+1)]=b((a1)b1cb1)\begin{aligned} &(a^{\underline{b}}+c^{\underline{b}})-(a’^{\underline{b}}+c’^{\underline{b}})\\ =&a(a-1)\cdots(a-b+1)-(a-1)(a-2)\cdots(a-b)+c(c-1)\cdots(c-b+1)-(c+1)c\cdots(c-b+2)\\ =&(a-1)(a-2)\cdots(a-b+1)[a-(a-b)]+c(c-1)\cdots(c-b+2)[(c+1)-(c-b+1)]\\ =&b\left((a-1)^{\underline{b-1}}-c^{\underline{b-1}}\right) \end{aligned}

该式在 a>ca>c 时恒非负,反之恒非正。故取到 a=ca=c 或者 a=c1a=c-1 时最优。\blacksquare

我们很容易将引理推广到不止一个变元的情况。由于 p=12ncnt(p)=n(n+1)\sum_{p=1}^{2n}\cnt(p)=n(n+1),故上式结果最小,各元素出现次数必尽量均摊。得到有 nncnt(p)=n2\cnt(p)=\frac{n}{2},另 nncnt(p)=n+22\cnt(p)=\frac{n+2}{2}。则 (p=12n(cnt(p)2))min=n((n/22)+(n/2+12))=n34\left(\sum_{p=1}^{2n}\binom{\cnt(p)}{2}\right)_{\min}=n\left(\binom{n/2}{2}+\binom{n/2+1}{2}\right)=\frac{n^3}{4}

假设所有交集大小均不足 n/2n/2。则其大小之和最多为 (n21)(n+12)=n3n22n4(\frac{n}{2}-1)\binom{n+1}{2}=\frac{n^3-n^2-2n}{4}。我们将空缺的部分用全等的集合填满,则至少有 n2+2n4/(n2+1)=n2\frac{n^2+2n}{4}/(\frac{n}{2}+1)=\frac{n}{2} 个交集大小满足题意。\square

于是乎每一次随机都将有 n/2n(n+1)/2=1n+1\frac{n/2}{n(n+1)/2}=\frac{1}{n+1} 的概率成功。故将在期望 n+1n+1 次随机后成功,复杂度得到保证。

C – 构型

我当然知道这是 DP,同时状态是由每一段 0011,以及由 22 构成的间隔划分的。不过场上没弄明白到底应该怎么不遗漏地计算一个方案的代价。

实际上,由于本题的操作之后是“取出元素后插入任意位置”,我们并不关心该元素去往何处。故而一旦我们取出“不应该存在于本段”中的元素,只要能够插入任意合法位置,它的代价便是恒定的(取出的元素个数)。

f(i,j,0/1/2)f(i,j,0/1/2) 表示“考虑第 ii 个元素恰划分为第 jj 段的末尾(最终序列中该位置为 22),且前序段落中只有含 0/10/1 或二者兼有的段落”的最小代价。朴素的转移需要枚举段落开头位置 k+1k+1,不过其代价只和 i,ki,k 线性相关,我们可以用前缀和优化。时间复杂度 O(n2)\bigO(n^2)

D – 散乱

你发现若设 DP 状态,则转移他一定需要考虑连通块形态和最大深度一类信息,复杂度是绝对不可接受的。 所以你要往贪心考虑。            ——mzx学长

若一个矿工处在节点 xx(深度 d1d_1),他挖掘的所有宝藏的最大深度为 d2d_2,且 d2+1<d1+kd_2+1<d_1+k,则我们把该矿工放到 xx 的父亲,效果是等价的。

矿工越少越好。故而我们检查一个节点是否需要指派新的矿工,是在该节点的 kk 级祖先处进行的。

假设我们从子树遍历到节点 xx,存在若干矿工现在能挖掘的最大深度为 mxd\text{mxd},当前统共剩余 rr 个可挖掘的宝藏。则我们贪心地使其挖掘 xx 子树内深度为 mxd,mxd1\text{mxd},\text{mxd}-1 的所有剩余宝藏,若他们的额度仍有剩余,则由上文提到的等价关系可知,把他们转移到 xx 的父亲,就可以挖掘 mxd2,mxd3\text{mxd}-2,\text{mxd}-3 的宝藏,以此类推。若某个宝藏与 xx 的深度差恰为 kk 且额度不足以挖掘,则我们被迫添置新矿工。

时间复杂度 O(nk)\bigO(nk)

  • 2022年10月26日