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
字符串,咕咕咕....
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号