序列性问题
一、基础操作与性质
这类问题直接考察对序列的基本操作实现、简单数据结构的应用,以及对数列基本性质的观察。
1.1 基础维护
问题特点:通常涉及对序列的直接模拟,如单点/区间修改、查询、翻转、循环移位等。
- 核心知识点:数组、
vector、list(链表)的熟练运用。 - 技巧:根据操作频率和类型选择数据结构。频繁在头部插入删除考虑链表。
- 典型例题:
- P3156 询问学号:纯粹的数组下标访问。
- P1160 队列安排:经典的链表模拟题,考察链表节点的插入与删除。
- P3613 寄包柜:可视为二维稀疏数组,用
vector或map套map维护。
1.2 栈与队列的经典模型
问题特点:问题本质与“后进先出”(LIFO)或“先进先出”(FIFO)相关。
- 核心知识点:栈 (
stack)、队列 (queue)、双端队列 (deque)、单调队列。 - 技巧:
- 栈:用于括号匹配、表达式求值、递归模拟、维护最近大于/小于关系。
- 单调队列:维护滑动窗口最值。
- 典型例题:
- P1449 后缀表达式:栈实现表达式求值。
- P1739 表达式括号匹配:栈的基本应用。
- P1886 滑动窗口 /【模板】单调队列:单调队列模板题。
- P4387 验证栈序列:模拟栈的入栈出栈过程。
1.3 序列的数学性质
问题特点:利用求和、异或、差分、周期性等数学性质来简化问题。
- 核心知识点:前缀和、异或前缀和、差分、模运算、周期规律。
- 技巧:
- 前缀和:快速求区间和,常结合哈希表解决“和为K的子数组”问题。
- 差分:将区间加/减转化为端点修改。
- 异或性质:
a ^ a = 0,a ^ 0 = a,前缀异或可用于处理区间异或问题。
- 典型例题:
- P3397 地毯:二维差分模板。
- P5638 光骓者的荣耀:利用前缀和与区间和。
- CF276D Little Girl and Maximum XOR:利用异或性质寻找最大异或对。
二、区间与子段问题
这是序列问题的核心,主要关注连续的一段(子数组/子段)的查询、修改和统计。
2.1 静态区间查询
问题特点:序列固定,多次查询区间信息(和、最值、第k大、不同数个数等)。
- 核心知识点:前缀和、ST表(RMQ)、前缀最大值数组、主席树(可持久化线段树)、莫队算法、分块。
- 技巧选择:
O(1)查询:前缀和(区间和)、ST表(最值,静态)。O(log n)查询:主席树(区间第k大、历史版本)、树状数组/线段树(可带修改)。O(√n)或基于移动:莫队(区间颜色数等离线问题)、分块(万能但略慢)。
- 典型例题:
- P3865 【模板】ST表:静态区间最值。
- P3834 【模板】可持久化线段树 2:静态区间第k小。
- P1972 HH的项链:经典离线树状数组/莫队题,求区间不同数个数。
2.2 动态区间问题
问题特点:序列元素可变(单点或区间修改),同时需要支持区间查询。
- 核心知识点:树状数组(BIT)、线段树、线段树合并、树套树、分块。
- 技巧选择:
- 单点修改+区间查询:树状数组(简洁高效)或线段树。
- 区间修改+区间查询:必须使用带懒标记的线段树。
- 极端情况:值域过大可离散化,二维问题可树套树(但常被主席树/CDQ分治替代)。
- 典型例题:
- P3374 【模板】树状数组 1:单点加,区间和。
- P3372 【模板】线段树 1:区间加,区间和(懒标记)。
- P3369 【模板】普通平衡树:可用权值线段树或树状数组实现。
2.3 区间最值贡献
问题特点:求所有子数组的某种聚合贡献,如(最大值-最小值)之和、所有子数组最大值的和等。
- 核心知识点:单调栈、贡献法。
- 核心思路:固定一个元素,考虑它作为最大值/最小值能覆盖多少个子数组。单调栈可以
O(n)求出每个元素左右第一个大于/小于它的位置,从而确定其“管辖”区间。 - 典型例题:
- P6503 单调栈:计算所有子数组最大值与最小值之差的和。
- CF817D 类型题:求所有子数组极差之和。
- LeetCode 907. 子数组的最小值之和:贡献法结合单调栈的经典应用。
2.4 二维偏序
问题特点:统计满足 i < j 且 a[i] < a[j](或其他二元关系)的数对 (i, j) 数量。本质是顺序和大小关系的结合。
- 核心知识点:归并排序求逆序对、树状数组、CDQ分治。
- 技巧选择:
- 逆序对:归并排序或树状数组。
- 更复杂的偏序(如
i<j, a[i]>a[j], b[i]<b[j]):CDQ分治。
- 典型例题:
- P1908 逆序对:二维偏序最基础形式。
- P1966 火柴排队:通过逆序对求解最小交换次数。
- P3810 三维偏序:CDQ分治模板题。
三、子序列与排列问题
关注按顺序但不一定连续的元素构成的问题。
3.1 经典子序列模型
问题特点:最长上升子序列(LIS)、最长公共子序列(LCS)及其各种变体。
- 核心知识点:动态规划、贪心+二分(LIS优化)、状态机DP。
- 技巧:
- LIS:
dp[i]表示以i结尾的长度,可优化为维护一个“最小末尾数组”并用二分查找。 - LCS:经典二维DP。若两个序列都是
1~n的排列,可转化为 LIS 问题。
- LIS:
- 典型例题:
- P1020 导弹拦截:经典LIS模型,第二问涉及 Dilworth 定理。
- P1439 最长公共子序列:排列上的 LCS 转 LIS。
- AT2827 LIS:最长公共子序列模板。
3.2 排列相关问题
问题特点:序列本身是 1~n 的一个排列。常利用排列的唯一性和值域特性。
- 核心知识点:置换环、逆序对、排列的字典序、构造。
- 技巧:
- 排列上的计数:常以值域为索引,简化状态。
- 排列的变换:通过交换相邻或任意元素达到目标,常与逆序对或置换环分析相关。
- 典型例题:
- P1525 关押罪犯:虽不是纯序列题,但体现了利用矛盾关系(可视为二分图)进行排序后贪心的思想。
- CF1768D Lucky Permutation:分析排列的置换环与逆序对奇偶性。
- P1088 火星人:求排列的下一个字典序排列(
next_permutation原理)。
四、序列变换与匹配问题
关注如何将一个序列变为另一个,或寻找特定模式。
4.1 字符串匹配
问题特点:在文本串中寻找模式串的出现位置。是序列问题的特例,但极为重要。
- 核心知识点:KMP、AC自动机、字符串哈希、Z函数(扩展KMP)。
- 技巧选择:
- 单模式串:KMP。
- 多模式串:AC自动机。
- 快速比较子串是否相等:字符串哈希。
- 典型例题:
- P3375 【模板】KMP:字符串匹配模板。
- P3808 【模板】AC自动机(简单版):多模式串匹配。
- P2957 字符串哈希:哈希判断子串相等。
4.2 序列比对与编辑
问题特点:求两个序列的相似度,或通过最少操作(增、删、改)使序列相同。
- 核心知识点:动态规划(编辑距离模型)、LCS的扩展。
- 典型例题:
- P2758 编辑距离:经典编辑距离DP。
- AT2827 LCS:最长公共子序列。
五、特殊序列与高级技巧
5.1 特殊序列
问题特点:序列本身具有特殊结构,如括号序列、循环序列、山脉序列等。
- 核心知识点:栈、贪心、特定性质(如合法括号序列前缀和>=0)。
- 典型例题:
- P7914 括号序列:括号序列的计数与合法性DP。
- P1368 最小表示法:求循环同构串中字典序最小的表示。
5.2 高级技巧综合
问题特点:综合运用多种数据结构与算法思想。
- 涉及技巧:扫描线、离线处理、分治(CDQ、整体二分)、线段树优化DP、斜率优化、wqs二分等。
- 典型例题:
- 扫描线:P5490 扫描线(虽为几何,思想可用于序列)。
- 线段树优化DP:P2605 基站选址。
- 整体二分:P3527 流星。
- wqs二分:P4383 林克卡特树(树上问题,但体现了该思想)。
解题思路总结与索引
遇到序列问题,可遵循以下思考路径:
- 判断问题本质:是连续区间还是子序列?是静态还是动态?是查询、修改还是计数/最优化?
- 分析操作类型:
- 静态查询:考虑前缀和、ST表、主席树、莫队。
- 动态修改:考虑树状数组、线段树。
- 区间修改:必须线段树懒标记。
- 子序列/排列:考虑DP、贪心、置换环。
- 观察数据范围:
n <= 10:指数级搜索/状压DP。n <= 1000:O(n²) DP或朴素算法。n <= 10^5:O(n log n) 算法,如线段树、树状数组、单调栈、排序+扫描。n <= 10^6:O(n) 算法,如双指针、单调队列、KMP、差分前缀和。
- 寻找特殊性质:是否为排列?是否有序?是否具有单调性?可否差分/前缀和转化?
- 回顾经典模型:问题是否可归约为逆序对、LIS、LCS、滑动窗口、贡献法等经典模型?
附录:核心技巧速查表
| 技巧 | 适用场景 | 典型时间复杂度 |
|---|---|---|
| 前缀和/差分 | 静态区间和、区间加、快速查询 | O(n) 预处理,O(1) 查询/修改 |
| 单调栈/队列 | 下一个更大元素、滑动窗口最值、贡献法 | O(n) |
| 树状数组 | 单点修改、区间和、前缀最值、逆序对 | O(log n) |
| 线段树 | 区间修改、查询、复杂合并操作 | O(log n) |
| 主席树 | 静态区间第k大、历史版本查询 | O(log n) |
| 莫队 | 离线区间询问、维护桶信息 | O(n√m) 或 O(n log n) |
| KMP | 单模式串匹配、求border | O(n+m) |
| AC自动机 | 多模式串匹配 | O(总长) |
| LIS贪心+二分 | 最长上升子序列 | O(n log n) |
| 归并排序/CDQ | 逆序对、二维/三维偏序 | O(n log n) |
文档说明:本指南试图构建一个从基础到进阶的序列问题分析框架。实际题目往往是多个类别的结合,关键在于准确识别其主模型并灵活运用技巧。持续练习和总结是提升解题能力的唯一途径。

浙公网安备 33010602011771号