数组离散化
离散化步骤
- 创建原数组的副本,同时记录每个元素出现的位置。
- 将副本按值从小到大排序,当值相同时,按出现顺序从小到大排序。
- 将离散化后的数字放回原数组。
原文oi wiki:贪心
序列定义:
问题:求 ∑aibj((i, j) 不重复)的最大值
表达式:
原文oi wiki:组合数
当数据规模较小时,可以使用动态规划的方式计算组合数。其核心思路基于组合数的递推公式
Cij=Ci−1j+Ci−1j−1
原文oi wiki:并查集
并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。
顾名思义,并查集支持两种操作:
合并(Union):合并两个元素所属集合(合并对应的树)
查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合
路径压缩
原文oi wiki:LIS
在最长上升子序列问题中,我们引入两个关键变量 i 和 j。这里,i 表示以其作为结尾的最长上升子序列的长度,而 j 则作为连接点,在构建最长上升子序列的过程中起着重要作用。
需要特别注意的是,dp[mx] 并不一定就是最终答案。在得出所有以不同元素结尾的最长上升子序列长度后,我们需要遍历整个结果数组,才能找出真正的最长上升子序列长度。
原文oi wiki:st表
基于倍增思想,我们考虑如何求出区间最大值。可以发现,如果按照一般的倍增流程,每次跳 2i 步的话,询问时的复杂度仍旧是 Θ(logn),并没有比线段树更优,反而预处理一步还比线段树慢。我们发现max(x,x)=x,也就是说,区间最大值是一个具有「可重复贡献」性质的问题。即使用来求解的预处理区间有重叠部分,只要这些区间的并是所求的区间,最终计算出的答案就是正确的。 如果手动模拟一下,可以发现我们能使用至多两个预处理过的区间来覆盖询问区间,也就是说询问时的时间复杂度可以被降至 Θ(1),在处理有大量询问的题目时十分有效。
原文oi wiki:string
后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 S 的从 i 开头的后缀表示为 Suffix(S,i),也就是 Suffix(S,i)=S[i..∣S∣−1]。