CF Edu160D Array Collapse

发布时间 2023-12-20 11:05:51作者: ydtz

可以操作任意多次。考虑 dp。

\(dp_i\) 表示考虑前 \(i\) 个位置之后,强制最终留下第 \(i\) 个位置上的数的方案数,转移时枚举前面的位置 \(j\),对于合法的决策 \(j\),显然需满足 \(\forall k\in(j,i)\)\(a_k>a_i\)\(a_k>a_j\)

显然可以提前预处理出每个位置 \(i\) 向前第一个比 \(a_i\) 小的数的下标 \(la_i\),则决策 \(k\in[la_i,i)\) 一定合法;对于决策 \(k\in[1,la_i)\),不难发现只有位于从 \(1\)\(la_i-1\) 组成的单调递增的单调栈内的下标才合法。

于是可以在 dp 过程中顺便维护 \(sum_i\) 表示 \(\sum_{j=1}^i dp_j\)\(f_i\) 表示前 \(i\) 项组成的单调栈内的 \(dp\) 值之和,即可做到 \(O(n)\) 转移。

转操作至局面充要。