A
先把第一个加到 \(a\) 中,然后扫到第一个不为 \(0\) 的开始给 \(b\)。
正确性显然。
B
可以交换,也就是可以任意重排。
那么记录一下 \(0, 1\) 的个数,从第一位开始模拟,知道 \(0\) 或 \(1\) 不够即可。
C
从低位往高位一位位做,假设当前做到第 \(i\) 位,有 \(c\) 个 \(2 ^ i\),那么做完后,可以两两配对得到 \((c - 1) / 2\) 个 \(2^{i + 1}\),如果某一位是 \(1\),并且 \(c\) 为 \(0\) 就无解。
D
设 \(f_{n, 0 / 1}\) 为考虑前 \(i\) 个数字,留 / 不留 \(p_i\) 的方案数。
首先考虑不留 \(p_i\) 的部分。
想要删掉 \(p_i\),至少要找到一个小于 \(p_i\) 的数才能做到,我们记 \(l_i\) 为 \(i\) 左边第一个小于 \(p_i\) 的数。
那么 \(f_{i, 0} = f_{l_i, 0} + f_{l_i, 1}\)。
因为想要删掉 \(i\) 至少需要包含区间 \([l_i, i]\),当然有可能是更前面的数,但那种情况也没有留 \([l_i + 1, i]\) 中的数,所以也计算在了 \(f_{l_i}\) 中,把 \([l_i + 1, i]\) 中的数删掉后,剩下的 \([1, l_i]\) 随便操作,我们并不关系 \(l_i\) 是否被删,所以 留和不留都加上。
考虑留 \(p_i\) 的部分。
第一个想法肯定是 \(f_{i, 1} = f_{i - 1, 0} + f_{i - 1, 1}\),因为会觉得既然留 \(i\) 那就前面所有的情况加上 \(i\)。
但其实这样会忽略掉一些情况,如可能有些数等到 \(i\) 加入序列后才能被删,如果直接拿 \(i - 1\) 算的话会算少。
同样依赖 \(l_i\),考虑 \([j, i], j \in [l_i + 1, i]\) 之间的操作,会删掉中间一段数,然后提供了 \(f_{j - 1, 1}\) 的贡献。
为什么不用加上 \(f_{j - 1, 0}\) ?
因为这种情况会被前面的考虑,当然 \(f_{l_i, 0}\) 不会被考虑,所以加上 \(f_{l_i, 0}\) 即可。
得到 \(f_i = \sum_{j = l_i}^{i - 1} f_{j, 1} + f_{l_i, 0}\)。
发现是区间和的形式,前缀和优化即可。
E
首先考虑如何构造出一组满足题目要求的解。
看到限制比较多的题目,想到网络流,我们给每一行每一列都建一个点,记为 \(R_i, C_i\)。我们给每个行的点连一条 \(S -> C_i\) 流量为 \(a_i\) 的边,\(R_i -> T\) 连一条流量为 \(b_i\) 的边,对于在一个点 \((i, j)\) 放 \(1\),我们让 \(C_i\) 向 \(R_j\) 连一条流量为 1 的边,对改图跑最大流即可。
对于原问题,考虑费用流,对于每个 \(0\) 的点,降他的费用设为 \(1\)。
首先强制所有 \(1\) 都变成 \(0\),那么如果他最后变成了 1,那么我们就要剪掉这个费用,那么我们把这类点的费用设为 -1,即可。
直接跑最小费用最大流。
F
string,待补。
标签:费用,code,删掉,CF,被删,即可,1913,考虑 From: https://www.cnblogs.com/Svemit/p/18360971