首页 > 其他分享 >CF1621G

CF1621G

时间:2023-11-05 10:33:44浏览次数:31  
标签:CF1621G pos 严格 序列 上升 该子 dp

传送门

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

标签:CF1621G,pos,严格,序列,上升,该子,dp
From: https://www.cnblogs.com/FreshOrange/p/17810288.html

相关文章

  • 【CF1621G】Weighted Increasing Subsequences 题解(优化树状数组)
    CF传送门|LG传送门。优化树状数组+反向处理。Solution发现直接做不好下手。难点主要在求出所有的上升子序列并计算它们分别的贡献。所以需要反向考虑每个单点在什么情况下产生贡献。一个单点会产生多少贡献。一个单点产生贡献的条件很容易得到。一个是在一个上升子序......
  • 「解题报告」CF1621G Weighted Increasing Subsequences
    比较套路的拆贡献题。考虑直接枚举那个\(j\),求有多少包含\(j\)的上升子序列满足这个子序列最后一个数的后面有大于\(a_j\)的数。首先对于\(j\)前面的选择方案是没有影响的,可以直接拿树状数组DP一遍得到。后面的过程我们可以找到从后往前第一个大于\(a_j\)的数的位置......