CF1474F题解
头脑风暴!
注意到 对答案一点用都没有,因为我们求的是长度,光一个 就能够确定答案了。
发现最长严格上升子序列的性质不太好刻画,我们考虑这个添加数的操作过程能不能以一种形式来表现出来。注意到每一个数具体取值只和最后一个数的变化有关,而且变化是连续的,考虑给它拍到二维平面上,横轴按照每一次添加一个数划分时间,纵轴为最后一个值的具体取值,原操作在二维平面上表现的是斜率为 1 或 -1 的一堆直线,如下图,红点表示一次插入操作的:
最长严格上升子序列的性质就很好刻画了,因为根据图来看其实就是最低点和最高点的极差就是我们的长度(因为斜率为)。让后我们考虑这个子序列个数怎么解决。发现直接 DP 求解答案十分困难,考虑发掘性质,首先不难发现一个性质:一个段不可能贡献超过一种答案,即一个点不可能成为最低点或最高点。
这个性质有什么用呢,也就是说,我们可以统计对段的答案进行贡献统计。然而注意到段数极小(数据范围),值域极大,有一个强烈的矩阵味道,但是我到现在连状态都没设计耶?
最长严格上升子序列可能从任意值拼过来,考虑在状态中加上这一个,设 表示目前计算到第 段,末尾值为 的方案数,哎这矩阵味道对了,转移:
矩阵快速幂优化,时间复杂度。
评论