CF1348 简要题解

啊这,又是赛时题解,希望不要 FST(

  • A

由于 \(2^n>\sum_{i=1}^{n-1} 2^i\),所以包含 \(2^n\) 的组要尽量小,也就是说他应该包含 \(2^{1}, 2^2, \ldots, 2^{\frac{n}{2}-1}, 2^n\)

  • B

假设我们已经构造出来了一个 \(b\),考虑一下它长什么样子。

由于所有长度为 \(k\) 的线段的和都相等,不难发现对于 \(i\in [k+1, m]\),有 \(b_i=b_{i-k}\)。也就是说,我们实际上需要构造一个长度为 \(k\) 的序列,满足它重复若干次后,存在一个子序列与 \(a\) 相同。

显然 \(a\) 中不同的数字超过 \(k\) 个时无解,否则只需要将 \(a\) 中每个不同的数字依次排开(不足时随意补全成 \(k\) 个),重复 \(n\) 次。由于每次重复时至少可以找到下一个 \(a\) 中的元素,且 \(nk\leq 10^4\),所以一定有解。

  • C

比较精污的一题……有可能 FST(

首先可以将 \(s\) 转化为每个字符出现的次数 \(a_i\),然后就是一万个特判。

第一种特殊情况是 \(k=1\) 时,此时只需要将 \(s\) 排序后输出。

否则必然有 \(k\geq 2\)

对于某个字符 \(c\),如果 \(s\) 中只有 \(c\) 这个字符,显然我们应该将 \(c\) 出现的次数均匀分配,答案为 \(c^{\lceil\frac{n}{k}\rceil}\)

否则必然出现了至少两种字符。我们找到最小的字符,记作 \(c_0\)

如果 \(c_0\) 出现了不足 \(k\) 次,则至少会有一个划分出来的序列的字典序 \(>c_0\)。显然,我们先按顺序给每个序列分配一个剩余的最小的字符,然后将剩下的字符都丢到第一个序列后面就可以了。答案是最后一个序列,也就是最小的 \(c\),满足 \(\sum_{i=c_0}^c a_i\geq k\)

否则 \(c_0\) 出现了至少 \(k\) 次,我们可以给每个序列分配一个 \(c_0\)

此时有两种策略:将所有剩下的字符丢到第一个序列中,或者在所有序列里均匀分配剩余的字符。不难发现,第二种方案更优,当且仅当 \(c_0\) 出现了恰好 \(k\) 次,且 \(s\) 中除了 \(c_0\) 外,只有一种字符。

  • D

实际上分裂后每个细菌的质量并不重要,我们只关心当前细菌的总质量和总个数。

形式化地说,我们有 \(a_0=b_0=1\),并且 \(a_i\in [a_{i-1}, 2a_{i-1}], b_i=b_{i-1}+a_i\)。我们希望得到最小的 \(i\),使得存在一种令 \(b_i=n\) 的方式。

由于 \(a_i\) 有着成倍增长的趋势,猜测答案是 \(O(\log n)\) 级别的。于是可以先让 \(a\) 最大限度地增长,不难发现 \(a_i=2^i, b_i=2^{i+1}-1\)

特判掉 \(n\leq 3\) 的情况。设 \(x=\log_2 n-2\),则 \(2^{x+2}\leq n<2^{x+3}\),答案至少是 \(x+2\)。不妨令 \(a_x=2^x, b_x=2^{x+1}-1\),考虑只调整 \(a_{x+1}\)\(a_{x+2}\) 来构造 \(n\)。如果 \(n\in [2^{x+2}+2^{x+1}-1, 2^{x+3}-1]\),显然只需要调整 \(a_{x+2}\) 即可。因此只考虑 \(n\in [2^{x+2}, 2^{x+2}+2^{x+1}-2]\) 的情况。

\(w=a_{x+1}-a_x\),则 \(b_{x+1}=b_x+a_{x+1}=2^{x+1}+2^x+w-1\)。由于 \(a_{x+2}\in [a_{x+1}, 2a_{x+1}]\),当 \(a_{x+2}\) 取到最小值时,有 \(b_{x+2}=b_{x+1}+a_{x+1}=2^{x+2}+2w-1\)。同理,当 \(a_{x+2}\) 取到最大值时,有 \(b_{x+2}=b_{x+1}+2a_{x+1}=2^{x+2}+2^x+3w-1\)。由于 \(a_{x+2}\) 可以取遍 \([a_{x+1}, 2a_{x+1}]\) 间的整数,\(b_{x+2}\) 自然也可以取遍上下界之间的整数。因此,我们只需要保证 \(n\in [\min b_{x+2}, \max b_{x+2}]\)。由于 \(n\geq 2^{x+2}+2w-1\)\(n\geq 2^{x+2}\),可知 \(\frac{1}{2}\leq w\leq \frac{n-2^{x+2}+1}{2}\)。结合上面的条件,可以知道,一定存在一种取 \(w\) 的方式,使得 \(n-\min b_{x+2}\leq 1\)。由于 \(\max b_{x+2}-\min b_{x+2}=2^x+w\geq 1\),这样取 \(w\) 一定合法。(不知道有没有更加简洁的做法……我尽力了)

  • E

有一个比较显然的结论:对于第 \(i\) 个灌木,它最优的方案中,“跨灌木” 的果子可能是 \((a_i+b_i)\bmod k\)\((a_i+b_i)\bmod k+k\) 个。

于是很容易设计 dp:设 \(f_{i, j}\) 表示前 \(i\) 个灌木,有 \(j\) 个 “跨灌木” 的红色果子还没凑成完整的篮子,此时最优的方案有 \(f_{i, j}\) 个完整的篮子。由于每个灌木对 “跨灌木” 的果子总数贡献模 \(k\) 是确定的,可以直接算出有多少个 “跨灌木” 的蓝色果子。

转移的时候直接枚举当前灌木新增了多少个 “跨灌木” 的红色果子即可,注意不能超出当前灌木的果子总数。时间复杂度 \(O(n^3)\)

  • F

不知道为什么出了一道 Hall 定理(以及它的推论)板子题……我还以为这是 Edu Round(

假设我们求出了一个完美匹配,现在要判断每条匹配边是否是必须边,即删去这条边后是否会导致匹配数减少。

将残量网络建出来,即匹配边从左向右,非匹配边从右向左。如果删掉某条匹配边 \((x, y)\) 后匹配总数不变,则必然存在一条 \(y\rightarrow x\) 的增广路,它交错经过了非匹配边和匹配边,否则必然不存在。再加上 \((x, y)\) 这条边,必然产生了一个环。因此只要 \(x, y\) 在同一个强连通分量里,就存在一条 \(y\rightarrow x\) 的增广路,即 \((x, y)\) 不是必须的。

建图需要线段树优化,初始解可以将所有区间按右端点排序后贪心,正确性都不难证明。值得一提的是,找到一条非必须的匹配边后,只需要将它原来的区间删去,并将生成的两个子区间分别放入集合中,尝试是否有解即可。

(咳咳,写完题解之后居然还没测完……不过 ABCD 都过了,大概是不会 FST 了)

posted @ 2020-05-02 01:50  suwakow  阅读(338)  评论(0编辑  收藏  举报
Live2D