CF1684H
作者:互联网
假设一共有 $c$ 个 $1$ ,$2^{d-1}<c \leq 2^d$ (先把 $c=0$ 判掉)。
然后划分方案很多种,连续 $x$ 个 $1$ 划分到同一段对最终总和的增加量大约是 $2^x$ 。
这个感觉就是很容易有解(因为划分的自由度极高)。
大概分析一下连续 $x$ 个 $1$ 内部划分能够得到什么结果。
$x>10$ 时一定能得到 $x$ 到 $2x$ 范围内的任何数,因为 $2^d<2c$ 我们自然猜想一定存在一种划分使得总和为 $2^d$ 。
但是 $x$ 很小的时候就非常麻烦,看起来要大分类讨论,况且中间的 $0$ 也不好处理,一不小心还会把复杂度写高了。
------------
但是啊,我们还有一种神奇的算法。我们在很久之前就学过它,但是现在用的越来越少,而且使用它会被当成无能的表现。
回忆一下几年前普及组训练的时候,自己最拿手的是什么?最常用的是什么?最喜欢的是什么???
每一位教练都会强调它的重要性,但是我们肯定都记不得了。
dfs+剪枝
没错,伟大的dfs往往能够避免各种分类讨论。
dfs(i,rem)
表示目前从第 $i$ 位开始,后面还需要 $rem$ 的总和。
如果序列第 $i$ 位是 $0$ 就跳过连续的 $0$ 到下一个 $1$ 。
其它情况:
因为连续 $x$ 个 $1$ 划分到同一段对最终总和的增加量大约是 $2^x$ 。
所以我们最多允许长度 $15$ 的划分。
直接枚举 $j=1->15$ 搜索,在判一下末尾。
但是这样会tle。
如果所需要的增加量(即 $2^d-c$ )非常大的话就会在最后一段几个位置一直搜,导致tle。
所以,当所需增加量大于20的时候倒过来搜( $j=15->1$ )。
最后再加个特判:前面一堆连续的 $0$ 最后连续 $5$ 个 $1$ 的情况。
这个凑不出 $8$ ,于是直接 $15+1$ 。
完了。
代码:
https://codeforces.com/contest/1684/submission/157757076
标签:增加量,15,CF1684H,dfs,划分,连续,rem 来源: https://www.cnblogs.com/csyakuoi/p/16294615.html