在阅读本篇题解之前,请阅读 [USACO24JAN] Cowmpetency S 题解(或者洛谷博客链接)。

首先考虑一个 O(nc2)O(nc^2) 的暴力 dp:设 fi,jf_{i, j} 表示目前考虑 aaii 项,前缀 max=j\max = j 的方案数。转移方程显然:

fi,j{j×fi1,jbi=1j×fi1,k(kj)bi=0j×fi1,k(k<j)bi=1f_{i, j} \gets \begin{cases} j \times f_{i - 1, j} & b_i = -1\\ j \times f_{i - 1, k} (k \le j) & b_i = 0\\ j \times f_{i - 1, k} (k < j) & b_i = 1\\ \end{cases}

可以前缀和优化至 O(nc)O(nc)

我们发现,如果将 bb 中连续的 0,10, -1 缩成一段,则段数是 O(q)O(q) 的,而连续的一段 0,10, -1 可以一起计算。设第 ii 段元素为 bib_i,长度为 cic_i(当 bi=1b_i = 1ci=1c_i = 1),fi,jf_{i, j} 表示目前考虑前 ii 段,前缀 max=j\max = j 的方案数。转移方程考虑讨论当前这一段是否出现了新的前缀最大值:

fi,jjci×fi1,j(bi1)fi,jgci(x)×fi1,k(k<j,bi1)f_{i, j} \gets j^{c_i} \times f_{i - 1, j} (b_i \ne 1)\\ f_{i, j} \gets g_{c_i}(x) \times f_{i - 1, k} (k < j, b_i \ne -1)\\

其中 gy(x)g_y(x)yy[1,x][1, x] 的整数至少有一个为 xx 的方案数,用任意情况减去一个 xx 都没有的情况可以推出 gy(x)=xy(x1)yg_y(x) = x^y - (x - 1)^y

可以前缀和优化至 O(qclogn)O(qc \log n)代码在这里。