CF Edu160D Array Collapse

考虑最终剩下的序列下标组成的序列 \(q\) 需要满足什么条件:

  • \(\forall i\in(1,siz_q]\)\(\forall j\in(q_{i-1},q_i)\)\(P_j>\min(P_{q_{i-1}},P_{q_i})\)

  • \(\forall j\in[1,q_1)\)\(P_j>P_{q_1}\)

  • \(\forall j\in (q_{siz_q},n]\)\(P_j>P_{q_{siz_q}}\)

可以操作任意多次。考虑 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)\) 转移。

转操作至局面充要。

posted @ 2023-12-20 11:00  ydtz  阅读(31)  评论(0编辑  收藏  举报