[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}\)。
暴力转移:
一个愚蠢的 \(\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\) 转移优化后:
时间复杂度 \(\Theta(n)\)。
代码就不放了,太难写了。
Solution 2
方便像我一样的脑瘫患者实现。
考虑一个最最最最最暴力的 \(\rm DP\):\(f_{i,j}\) 表示前 \(i\) 位合法且最后的 \(b_i=j\) 的方案数。易得转移:
\(\mathcal O(nV)\),还没老瘟猪跑得快。
结果发现这其实是一个区乘区加的板子,从 \(i-1\) 转移至 \(i\) 相当于将 \(f_{i-1}\) 执行整体 \(\times (-1) + S\) 的操作,最后把不合法的状态全部乘 \(0\),就完了,非常的简单,极其的脑瘫。时间复杂度 \(\Theta(n \log V)\),离散化后可以做到 \(\Theta(n \log n)\)。
代码就不放了,太脑瘫了。

                
            
        
浙公网安备 33010602011771号