2024.11.7总结


A

考虑逐位确定答案,答案的位数是 O(k+logn)\mathcal O(k+\log n) 的,因此可以将问题转化为 O(k+logn)O(k+\log n) 次询问形如 x1x2x3xk??\overline{x_1x_2x_3\cdots x_k?\cdots ?} 的数有多少种方案将 ?? 替换为 080\sim 8 使得这个数是 10k110^k-1 的倍数。

一个数是 10k110^k-1 的倍数当且仅当从低往高位,每 kk 位划为一段,所有段的和是 10k110^k-1 的倍数。

因为段数很少(设为 ll),不妨先枚举这个和,即 [i(10k1)]i=0l[i(10^k-1)]_{i=0}^{l}。接下来按照在段中的位置,从低往高数位 dp 即可。

时间复杂度 O(log(n+k))\mathcal O(\log (n+k))

B:

两面一定是 11 或出现过的数字,因此可以离散化。

如果不考虑买硬币的代价,两面是独立的,先求出一面是 aa 时的收益 SaS_a,这可以简单通过前缀和得到。

接下来需要求出 maxa,b{Sa+Sbab}\max_{a,b}\{S_a+S_b-ab\},考虑固定 aa,发现只有在凸包上的 bb 有用,反之亦然。因此只保留凸包上的点,继而可以双指针。

时间复杂度 O(n)\mathcal O(n)

C:

发现每次可以通过添加两个数,使得方案数 ×2\times2×2+1\times2+1,这样可以拿到 60pts,打表 + 预处理可以优化成 75pts。

考虑构造如下由两部分组成的方案结构:

  1. 序列 (ai)i=1n(a_i)_{i=1}^n,满足 ai>0a_i\gt 0

  2. 序列 (bi)i=1m(-b_i)_{i=1}^m,满足 bi>ai2b_i\gt \frac{\sum a_i}{2}

这个方案的零和子集一定是空集或选出一些 aia_i 使得他们的和是某个 bjb_j,由这些形成 aia_i 和形成的 bjb_j 的集合,因此如果固定 aa,每个 bib_i 的贡献是独立的。

考虑令 aa 为某个优秀的常序列,预处理出每个 xx 如果加进 bb 中会对答案产生多少贡献,这可以通过背包求出,接下来考虑对于每个目标零和子集数求出方案,这同样可以用背包求出。

选择一个比较随机的 aa 序列可以通过,时间复杂度为 O(106×22)\mathcal O(10^6\times 22)