ARC058(2020.7.4)
A
从高到低依次填入能填的最小值即可。
B
首先可以发现这个区间实际上只有横着的一条边有用,那么我们可以在边界上枚举中转点使得不经过非法区域即可。
C
挺神的一道题。首先我们会发现如果直接算出合法序列非常不好做,因为可能一个合法序列中可能有多个满足条件的句子,那么很难设计一种状态不会记重,那么我们考虑容斥,算出不合法的序列。我们发现我们需要关注的实际上是原序列中的一段子串,并且需要判断该子串是否能能形成满足条件的句子,事实上这里的子串长度不会超过 (X + Y + Z le 17) 于是我们可以考虑 (dp),令 (dp_{i, j, k, cdots}) 为到第 (i) 为位置,最后 (17) 位分别为 (j, k, cdots) 的总共不合法序列,首先与处理一下每个子串是否合法就可以做到 (O(n 10 ^ {X + Y + Z}))。现在我们考虑这样一个表示法,比如我们将 (2) 表示成 (10),将 (4) 表示成 (1000) 即将 (x) 表示成 (1000cdots) 后面 (x - 1) 个 (0) 的形式,那么两个数加起来比如 (2 + 4 = 101000) 倒数第 (6) 位就变成了 (1),那么对于任意一个二进制串如果他在倒数 (X + Y + Z, Y + Z, Z) 的位置上为 (1) 那么这个子串就一定是一个满足条件的句子。换种说法,对于一个二进制串 (S),和答案串即只有倒数 (X + Y + Z, Y + Z, Z) 的位置上为 (1) 的串 (Ans) 满足 (S & Ans = Ans) 那么 (S) 就是一个满足条件的子串。那么现在我们就可以将 (dp) 的最后暴力枚举的位置改成这样的状压的形式,再去看我们关心的最后 (X + Y + Z) 个位置,实际上就是二进制串下的最后 (X + Y + Z) 个位置,那么我们只需要记录最后 (X + Y + Z) 的答案即可,于是复杂度变成了 (O(n 2 ^ {X + Y + Z})).
D
字符串,咕咕咕....