该题解为残缺品,笔者自己也不是很懂
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] ext{ and } a_[l_i + 1] ext{ and } ldots ext{ and } a[r_i] = x_i)。
两个序列 (a, b) 被认为是不同的,当且仅当存在一个位置 (i) 满足 (a_i eq 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] ext{ and } a_[l_i + 1] ext{ and } ldots ext{ and } a[r_i] = x_i)。
两个序列 (a, b) 被认为是不同的,当且仅当存在一个位置 (i) 满足 (a_i eq 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)时的方案数,分三种情况转移
- (j<pos_i),则(f_{i,j}=0),这种情况不可能
- (pos_ileq j leq i-1),则(f_{i,j}=f_{i-1,j}),因为(i)这里没有决策,只能填(1)
- (i=j),则(f_{i,i}=sum_{x=pos[i-1]}^{i-1}f_{i-1,x})