CF 1621G-Weighted Increasing Subsequences

题意

对于一个正整数序列 a1na_{1 \ldots n} 的一个严格上升子序列 ai1,ai2,,aika_{i_1},a_{i_2}, \ldots ,a_{i_k} 权值为存在 p>ikp > i_kap>aja_p>a_jjij\in i 的数量。求所有严格上升子序列权值和。(2×1052 \times 10^5)

Solution

以下上升子序列均表达为子序列

首先套路的转换为统计对于一个位置 jj ,有多少个包含它的能造成贡献的子序列。

找到最大的 pp 满足 ap>aja_p>a_j,则能造成贡献的子序列满足 ik<pi_k<p

正向统计不好统计考虑正难则反,统计包含 jj 的满足 ikpi_k \ge p 的子序列。

首先包含 jj 的上升子序列个数为 以 j 为终点的子序列数 ×\times 以 j 为起点的子序列数

由于 pp 是最大的 ap>aja_p>a_j 的位置,若存在更大的 p>pp'>p 也满足 ap>aja_p'>a_j,则 pp 不是最大位置。也就是说,不存在 ik>pi_k > p 的子序列,只可能存在 ik=pi_k = p 的子序列。

综上,不合法的子序列个数为包含 jj 且以 pp 为终点的子序列个数,倒序转移时只选择 i>ii'>iai[ai+1,ap1]a_i' \in [a_i+1,a_p-1] 的位置转移,再加上 pp 位置的转移,注意这里的 pp 是对于 ii 的最大位置。

总结一下,我们要统计后缀最大位置,以及以某个点为起点/终点,以及限定转移点值域的以某个点为起点的子序列个数,这些都可以用树状数组维护。复杂度 O(nlogn)O(nlogn)

code

Author: cjh-hhz
Link: https://cjh-hhz.github.io/3da65f616d4b.html/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.