CF1348 简要题解

Posted suwakow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) 的线段的和都相等,不难发现对于 (iin [k+1, m]),有 (b_i=b_{i-k})。也就是说,我们实际上需要构造一个长度为 (k) 的序列,满足它重复若干次后,存在一个子序列与 (a) 相同。

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

  • C

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

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

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

否则必然有 (kgeq 2)

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

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

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

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

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

  • D

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

形式化地说,我们有 (a_0=b_0=1),并且 (a_iin [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)

特判掉 (nleq 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)。如果 (nin [2^{x+2}+2^{x+1}-1, 2^{x+3}-1]),显然只需要调整 (a_{x+2}) 即可。因此只考虑 (nin [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}) 自然也可以取遍上下界之间的整数。因此,我们只需要保证 (nin [min b_{x+2}, max b_{x+2}])。由于 (ngeq 2^{x+2}+2w-1)(ngeq 2^{x+2}),可知 (frac{1}{2}leq wleq 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+wgeq 1),这样取 (w) 一定合法。(不知道有没有更加简洁的做法……我尽力了)

  • E

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

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

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

  • F

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

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

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

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

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

以上是关于CF1348 简要题解的主要内容,如果未能解决你的问题,请参考以下文章

CF1354&CF1355 简要题解

[CF1228] 简要题解

CF1329 简要题解

CF1149 简要题解

CF1083(Round #526 Div. 1) 简要题解

CF1324A Yet Another Tetris Problem 题解