[ARC224F] AND/OR
[ARC224F] AND/OR
给定正整数 \(n\) 和长为 \(n\) 的序列 \(A\)。最初,\(x=0\),接下来依次进行操作,\(i = 0,1,\dots, n\):
- 选择将 \(x\) 按位与上 \(A_i\),或将 \(x\) 按位或上 \(A_i\)。
其中,按位或的操作不能进行超过 \(K\) 次。设这样的操作能够得到的最大值为 \(M\),求有多少种不同的操作方法可以得到 \(M\)。
\(1 \le K \le n \le 2 \cdot 10^5, 0 \le A_i < 2^{60}\)。
\(M\) 显然等于最后 \(K\) 个 \(A_i\) 按位或的值。
接下来进行调整。倒着看,为了不破坏最大的性质,如果想让 \(A_j\) 的位置使用与运算(而后面全部是或),只需要关注此处必须为 \(1\) 的位,即 \(A_{j+1} \sim A_{n}\) 都不为 \(1\) 但 \(M\) 为 \(1\) 的位,令这些位的掩码为 \(S\),则 \(S \subseteq A_j\),且\(A_{1 \sim j-1}\) 的运算得到的数 \(x\) 必须满足 \(S \subseteq x\)。
不妨先进行一个暴力搜索的算法:记录当前位 \(i\) 与得到的 \(x\) 的要求(必须为 \(1\) 的位,掩码 \(S\)),采取或运算的 \(A_i\) 个数 \(j\)。
对于 \(A_i\),如果 \(S \subseteq A_i\),那么此处可以选择使用与运算,\(S\) 不变;而此处使用或运算的直接结果是 \(S \gets 0\),即前面没有要求,随意填。
如果 \(S \nsubseteq A_i\),则此处只能使用或运算;结果是使 \(S \gets S \operatorname{AND} \overline{A_i}\)。
所以我们发现第一种情况的分支可以直接计算,第二种情况没有分支。所以可以直接 dp 了,只是一个递推。
由于 \(i\) 和 \(K-j\) 一直在减小,所以下指标求和是可以做到 \(O(n)\) 的。
为什么 ds 做不来大水题。👿(你为什么要拿 ds 做呢)

浙公网安备 33010602011771号