Atcoder ARC-058

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\) 表示成 \(1000\cdots\) 后面 \(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

字符串,咕咕咕....

posted @ 2020-09-15 21:59  Achtoria  阅读(134)  评论(0)    收藏  举报