CF1621G

发布时间 2023-11-05 10:28:57作者: zzafanti

传送门

description

长度为 \(n\) 的序列 \(a\) 的一个严格上升子序列的权值为该子序列中严格比序列 \(a\) 中该子序列右边最大值小的数的个数,求序列 \(a\) 的所有严格上升子序列的权值和。

\(n\leq 2\times 10^5\)

solution

离散化。

先转化成对每个数 \(a_i\) 算贡献,计算以 \(a_i\) 为起点有多少个严格上升子序列满足该子序列的最大值在 \(a\) 中所在位置的右边还有比 \(a_i\) 严格大的数。再乘上以 \(a_i\) 为终点的严格上升子序列个数,这个可以树状数组优化 dp,\(O(n\log n)\)

下面主要考虑如何计算以 \(a_i\) 为起点的满足最大值右侧存在比 \(a_i\) 大的数的严格上升子序列的个数。

倒着暴力 dp 是 \(O(n^3)\) 的,不能接受。

考虑这样转移:

\(a_i\) 处的 dp 值要从 \(a_j\) 处转移过来,且 \(pos\) 是满足 \(a_{pos}>a_i\) 的最大的 \(pos\)

  • \(a_j<a_{pos}\),那么 \(a_j\)\(a_i\) 的贡献就是 \(a_j\) 处的 dp 值,因为此时显然 \(a_i\)\(a_j\)\(pos\) 相同。

  • \(a_j>a_{pos}\),那么以 \(a_j\) 为起点的所有上升子序列都合法,因为它的终点一定再 \(pos\) 前,否则就与 \(pos\) 的最大性矛盾。

因此,我们用两个树状数组分别维护 dp 值和上升子序列个数即可。

时间复杂度 \(O(n\log n)\)

本题重点在于发现转移分类讨论的性质。

code

Submission #228774204 - Codeforces