D. Sum of LDS
问题描述
给定一个长度为 的排列 (即一个包含从 到 的每个整数恰好一次的数组),其性质为对于每个 :
对于每一对索引 ,考虑子数组 。令 表示该子数组中最长递减子序列的长度。
计算总和:
定义:
- 一个长度为 的 排列 是一个由 个从 到 的不同整数按任意顺序组成的数组。
- 数组 中长度为 的 递减子序列 是一个索引序列 ,使得 。
题解概述
让我们逐步分析问题:
关键约束: 条件 确保了排列中不会出现连续两次上升。
LDS 贡献: 对于任何一对 其中 ,这两个元素形成一个“块”,可以对任何包含它们的子数组的最长递减子序列(LDS)做出贡献。然而,实际上只有其中一个会增加LDS的长度。
计算贡献: 对于每个这样的对 其中 ,包含它们的子数组数量为 ,其中 是 的索引(0-based)。
LDS 总和: 如果没有这样的对,总和就是所有子数组长度的总和:
否则,对于每个 的对 ,减去多计算的贡献。这部分可以用 优化,但我没有实现。
算法步骤:
- 遍历排列并识别所有 的对 。
- 对于每个这样的对,从LDS总和中减去 。
- 输出最终结果。
这种方法利用了排列的结构,并有效地计算了所需的总和。