loading...

[CF1585F]Non-equal Neighbours

链接

Description

求满足以下条件的 \(b\) 序列个数,对 \(998 \ 244 \ 353\) 取模:

  • \(\forall i\in[1,n]:1\le b_i\le a_i\)
  • \(\forall i\in[1,n):b_i\neq b_{i+1}\)

Solution 1

容易想到一种容斥解法,钦定存在至少 \(k\)\(b_i\neq b_{i+1}\),方案数为 \(f_k\)。则答案为 \(\displaystyle\sum_{i=0}^{n-1} (-1)^if_i\)

定义 \(\rm DP\) 状态,\(g_{i,k}\) 表示至少有 \(k\)\(j\in[1,i)\) 满足 \(b_j \neq b_{j+1}\),则 \(f_k=g_{n,k}\),不难发现 \((-1)^k\) 只与 \(k\) 的奇偶性有关,于是我们只需要给出 \(f_{0/1}\) 表示钦定存在至少偶数/奇数个 \(b_i\neq b_{i+1}\) 的方案数即可,因此我们可以把状态优化成 \(g_{i,0/1}\),即至少有偶数/奇数个 \(j\in[1,i)\) 满足 \(b_j \neq b_{j+1}\)

暴力转移:

\[c\in\{0,1\}: g_{i,c}=\sum _{j=0}^{i-1} g_{j,1-c}\min\{a_{j+1},\dots,a_{i-1},a_i\} \]

一个愚蠢的 \(\mathcal{O} (n^2) \ \rm DP\) 就出炉了,考虑优化。

我们从 \(\min\) 入手,看看有什么地方可以偷懒。发现 \(g_{j,1-c}\) 只与 \(j\) 有关,若 \(\min\{a_{j+1},\dots,a_{i-1},a_i\}\)\(i\) 无关就好了。考虑找到最大的 \(1\le p<i\) 使得 \(a_p \le a_i\),那么 \(\forall j \le p\)\(a_i\) 的值不会影响到 \(\min\) 那一坨。这个东西直接用单调栈维护就可以了。

那么可以省略 \(j\le p\) 的转移,再来看 \(p<j<i\) 部分的转移,显然这一段的最小值均为 \(a_i\),可以把 \(a_i\) 提出去,变成 \(a_i\times \sum\limits_{j={p+1}}^{i-1}g_j\)。前缀和即可。

所以 \(\rm DP\) 转移优化后:

\[c\in\{0,1\}: g_{i,c}=g_{p,c}+a_i(s_{i-1,1-c}-s_{j,1-c}) \]

时间复杂度 \(\Theta(n)\)

代码就不放了,太难写了。

Solution 2

方便像我一样的脑瘫患者实现。

考虑一个最最最最最暴力的 \(\rm DP\)\(f_{i,j}\) 表示前 \(i\) 位合法且最后的 \(b_i=j\) 的方案数。易得转移:

\[\begin{aligned} &S = \sum _{k=0}^{V} f_{i-1,k}\\ &j\in[1,a_i]:f_{i,j}=S-f_{i-1,j} \end{aligned} \]

\(\mathcal O(nV)\),还没老瘟猪跑得快。

结果发现这其实是一个区乘区加的板子,从 \(i-1\) 转移至 \(i\) 相当于将 \(f_{i-1}\) 执行整体 \(\times (-1) + S\) 的操作,最后把不合法的状态全部乘 \(0\),就完了,非常的简单,极其的脑瘫。时间复杂度 \(\Theta(n \log V)\),离散化后可以做到 \(\Theta(n \log n)\)

代码就不放了,太脑瘫了。

posted @ 2025-02-14 12:00  goldspade  阅读(15)  评论(1)    收藏  举报