导航

垃圾脑瘫的坑

该题解为残缺品,笔者自己也不是很懂

CF1327F AND Segments题解

题目描述

你有三个整数 \(n, k, m\) 以及 \(m\) 个限制 \((l_1, r_1, x_1), (l_2, r_2, x_2), \ldots, (l_m, r_m, x_m)\)

计算满足下列条件的,长度为 \(n\) 的序列 \(a\) 的个数:

  • 对于每个 \(1 \le i \le n\)\(0 \le a_i \lt 2 ^ k\)

  • 对于每个 \(1 \le i \le m\),数字的按位与 \(a[l_i] \text{ and } a_[l_i + 1] \text{ and } \ldots \text{ and } a[r_i] = x_i\)

两个序列 \(a, b\) 被认为是不同的,当且仅当存在一个位置 \(i\) 满足 \(a_i \neq b_i\)。 由于答案可能过大,请输出其对 \(998\ 244\ 353\) 取模的结果。

解题思路

CF1327F AND Segments题解

题目描述

你有三个整数 \(n, k, m\) 以及 \(m\) 个限制 \((l_1, r_1, x_1), (l_2, r_2, x_2), \ldots, (l_m, r_m, x_m)\)

计算满足下列条件的,长度为 \(n\) 的序列 \(a\) 的个数:

  • 对于每个 \(1 \le i \le n\)\(0 \le a_i \lt 2 ^ k\)

  • 对于每个 \(1 \le i \le m\),数字的按位与 \(a[l_i] \text{ and } a_[l_i + 1] \text{ and } \ldots \text{ and } a[r_i] = x_i\)

两个序列 \(a, b\) 被认为是不同的,当且仅当存在一个位置 \(i\) 满足 \(a_i \neq b_i\)。 由于答案可能过大,请输出其对 \(998\ 244\ 353\) 取模的结果。

解题思路

对于每一位,我们可以分开考虑。

假设考虑到第\(a\)位。

对于每段区间,若\(x_i\)对应的位为\(1\),那么整段区间这位对应的数都是\(1\),用差分数组维护

对于\(x_i\)\(0\)的区间,考虑用DP求解方案数。

为转移方便,我们维护一个\(pos_i\)表示\(i\)之前的第一个0至少填在\(pos_i\)这个位置,可以参考代码理解

\(f_{i,j}\)表示从低到高位填到第\(i\)位,最后一个0的位置为\(j\)时的方案数,分三种情况转移

  1. \(j<pos_i\),则\(f_{i,j}=0\),这种情况不可能
  2. \(pos_i\leq j \leq i-1\),则\(f_{i,j}=f_{i-1,j}\),因为\(i\)这里没有决策,只能填\(1\)
  3. \(i=j\),则\(f_{i,i}=\sum_{x=pos[i-1]}^{i-1}f_{i-1,x}\)

posted on 2021-09-30 10:00  CHK666  阅读(54)  评论(0编辑  收藏  举报