arc179_b

方便实现,这里数字的范围改为 \(0 \sim m - 1\)

看到数据范围:\(n <= 10^4, m <= 10\),又根据题目说存在 \(A_m = X_b\),优先思考状压。

考虑设计状态:

状态:\((i, S)\) 表示考虑前 \(i\) 个数字,接下来可以放的数字的二进制形式为 \(S\)

转移:\((i, S) \rightarrow (i + 1, (S - 2 ^ j) \operatorname{or} f_j)\),其中 \(0 \le j < m\)\(S \operatorname{and} 2^j \ne 0\)\(f_j\) 表示满足 \(X_{id} = j\)\(id\) 所构成的二进制。

QOJ8519

不会做

arc177_c

证明:一定存在最优方案使得两条路径之多会有一个交点。(我不会证)

然后根据这个性质可以枚举重合点,并用 01 bfs 计算出路径的代价。

接着处理一下不相交的代价。

QOJ8520

\(dp_i\) 表示以 \(i\) 结尾的价值总和, \(S_i\) 为前缀异或。

\(dp_i = \sum \limits_{j = 1} ^ {i} dp_{j - 1} \times (S_i \operatorname{xor} S_{j - 1})\)

然后我们将这个式子在二进制下拆解:

\(S_i\) 在第 \(k\) 位为 \(1\),则在这一位下只有 \(S_j\) 在 第 \(k\) 位为 \(0\) 才会带来 \(2^k \times dp_k\) 的贡献,其中 \(0 \le k \le i - 1\)

\(S_i\) 在第 \(k\) 位为 \(0\),则同理。

那么我们令 \(sum_{i, j, 0 / 1}\) 表示 \(dp_{1 \sim i}\)\(S_i\)\(j\) 位为 \(0 / 1\),符合条件的 \(dp_x\) 的总和。

那么我们只需在转移的时候枚举每一位,并计算这一位的贡献。

因为我们是依次处理 \(dp_i\) 的,所以可以省去 \(sum\) 数组的第一维。

posted on 2024-07-03 11:38  appear  阅读(15)  评论(0)    收藏  举报