CF2119 VP&补题笔记

D

Statement

合法序列 aa 满足 0aii0 \le a_i \le i
f(a)f(a) 的定义为:初始有 nn 个标记,依次从 [ai,i][a_i,i] 上移除一个标记( ai=0a_i=0 则不做操作),f(a)f(a) 即为移除标记排列数。

给定 n5000n \leq 5000,对于所有长度为 nn 的合法序列 aa,求 f(a)\sum{f(a)} 。答案对 mm 取模。

Solution

正难则反,考虑对每一种标记移除排列方案,从后往前考虑每一个被移除的标记 ii ,设已经被移除的标记数为 jj,其可能的被移除的方式有 i×(ni+1j)i \times (n-i+1-j) 种。对于整个排列方案,运用乘法原理即可。

dp[i][j] 为到位置 ii 的标记,已经移除了 jj 个标记的答案数,从后往前 dp 即可。
submission

E

Statement

给定一个长度为 n1n-1 的序列 aa 和一个长度为 nn 的序列 bb。要求增加 bib_i 的值(可以不变)使得 b_i & b_{i+1} = a_i 并使得 bib_i 的总增加量最小,求这个最小值。 n105,ai,bi<229n \le 10^5 , a_i,b_i < 2^{29}

solution

首先 bib_i 一定是 ci=ai1aic_i = a_{i-1} | a_{i} 的超集,只需要在 cic_i 的基础上加位保证大于等于 bib_i 且满足约束条件即可。

对于每一个 cic_i ,从高到低位扫描,若是 11 就跳过(不能做改动),若是 00 就考虑变 11 ,如果变之后大于等于 bib_i 就将这个数加入候选列表里然后继续往下一位扫描,如果仍然小于就将这一位 11 固定下来(这一位若不为 11,如何改动后面的低位也无法让这个数大于 bib_i 了)然后继续往后扫描,不难看出这一流程之后每个 ii 可取的数的数量不会超过 3232 ,然后dp即可。
submission