让你求一个序列$a[l_i]\&a[l_i+1]….a[r_i]=x$的方案数。$0\leq a^i<2^k$
二进制位之间独立,按位讨论。若$(l,r,x),x=1$则里面都是$1$。若$(l,r,x),x=1$,至少出现是$1$。
拿样例$2$的第$1$位解释
$5\ 2\ 3$
$1\ 3\ 2$
$2\ 5\ 0$
$3\ 3\ 3$
分解就是$??1??$,$(1,3)和(2,5)$至少有一个$0$。
设$dp[i][j]$为前第$i$数,最前面的$0$在第$j$位的填法。
若搜到出现边界$r$,
- $[r,l_x],[r,l_y]$取$min(l_x,l_y)$
- 若这一位填$0$,$dp[i][i]=\sum dp[i-1][j]$
- 若这一位填$1$,需要$(l,r)$之间有$0$。$dp[i][j]=\sum_l^{r-1} dp[i-1][j]$
- 发现了$i-1$这一唯独不需要。$\sum dp[j]-\sum_0^{l-1}dp[j]=\sum_l^{r-1} dp[j]$
假设$r_x>r_y$,若$l_x<l_y$,则之前的方案已经保证了$[l_x,r_x]$不需要重新计算,所以只需记录下$\sum dp$,每次需要减去的指针一定不会向后移动。
代码
1 |
|