头脑风暴!

注意到xx 对答案一点用都没有,因为我们求的是长度,光一个dd 就能够确定答案了。

发现最长严格上升子序列的性质不太好刻画,我们考虑这个添加数的操作过程能不能以一种形式来表现出来。注意到每一个数具体取值只和最后一个数的变化有关,而且变化是连续的,考虑给它拍到二维平面上,横轴按照每一次添加一个数划分时间,纵轴为最后一个值的具体取值,原操作在二维平面上表现的是斜率为 1 或 -1 的一堆直线,如下图,红点表示一次插入操作的:

最长严格上升子序列的性质就很好刻画了,因为根据图来看其实就是最低点和最高点的极差就是我们的长度(因为斜率为±1\pm 1)。让后我们考虑这个子序列个数怎么解决。发现直接 DP 求解答案十分困难,考虑发掘性质,首先不难发现一个性质:一个段不可能贡献超过一种答案,即一个点不可能成为最低点或最高点。

这个性质有什么用呢,也就是说,我们可以统计对段的答案进行贡献统计。然而注意到段数极小(数据范围nn),值域极大,有一个强烈的矩阵味道,但是我到现在连状态都没设计耶?

最长严格上升子序列可能从任意值拼过来,考虑在状态中加上这一个,设f(i,j)f(i,j) 表示目前计算到第ii 段,末尾值为jj 的方案数,哎这矩阵味道对了,转移:

f(i,j)=k=0if(k,j1)f(i,j)=\sum\limits_{k=0}^i f(k,j-1)

矩阵快速幂优化,时间复杂度O(n4logV)O(n^4 \log |V|)

Submission #333002703