序列性问题

一、基础操作与性质

这类问题直接考察对序列的基本操作实现、简单数据结构的应用,以及对数列基本性质的观察。

1.1 基础维护

问题特点:通常涉及对序列的直接模拟,如单点/区间修改、查询、翻转、循环移位等。

  • 核心知识点:数组、vectorlist(链表)的熟练运用。
  • 技巧:根据操作频率和类型选择数据结构。频繁在头部插入删除考虑链表。
  • 典型例题

1.2 栈与队列的经典模型

问题特点:问题本质与“后进先出”(LIFO)或“先进先出”(FIFO)相关。

1.3 序列的数学性质

问题特点:利用求和、异或、差分、周期性等数学性质来简化问题。

  • 核心知识点:前缀和、异或前缀和、差分、模运算、周期规律。
  • 技巧
    • 前缀和:快速求区间和,常结合哈希表解决“和为K的子数组”问题。
    • 差分:将区间加/减转化为端点修改。
    • 异或性质a ^ a = 0, a ^ 0 = a,前缀异或可用于处理区间异或问题。
  • 典型例题

二、区间与子段问题

这是序列问题的核心,主要关注连续的一段(子数组/子段)的查询、修改和统计。

2.1 静态区间查询

问题特点:序列固定,多次查询区间信息(和、最值、第k大、不同数个数等)。

  • 核心知识点:前缀和、ST表(RMQ)、前缀最大值数组、主席树(可持久化线段树)、莫队算法、分块。
  • 技巧选择
    • O(1)查询:前缀和(区间和)、ST表(最值,静态)。
    • O(log n)查询:主席树(区间第k大、历史版本)、树状数组/线段树(可带修改)。
    • O(√n)或基于移动:莫队(区间颜色数等离线问题)、分块(万能但略慢)。
  • 典型例题

2.2 动态区间问题

问题特点:序列元素可变(单点或区间修改),同时需要支持区间查询。

  • 核心知识点:树状数组(BIT)、线段树、线段树合并、树套树、分块。
  • 技巧选择
    • 单点修改+区间查询:树状数组(简洁高效)或线段树。
    • 区间修改+区间查询:必须使用带懒标记的线段树。
    • 极端情况:值域过大可离散化,二维问题可树套树(但常被主席树/CDQ分治替代)。
  • 典型例题

2.3 区间最值贡献

问题特点:求所有子数组的某种聚合贡献,如(最大值-最小值)之和、所有子数组最大值的和等。

  • 核心知识点:单调栈、贡献法。
  • 核心思路:固定一个元素,考虑它作为最大值/最小值能覆盖多少个子数组。单调栈可以 O(n) 求出每个元素左右第一个大于/小于它的位置,从而确定其“管辖”区间。
  • 典型例题

2.4 二维偏序

问题特点:统计满足 i < ja[i] < a[j](或其他二元关系)的数对 (i, j) 数量。本质是顺序和大小关系的结合。

  • 核心知识点:归并排序求逆序对、树状数组、CDQ分治。
  • 技巧选择
    • 逆序对:归并排序或树状数组。
    • 更复杂的偏序(如 i<j, a[i]>a[j], b[i]<b[j]):CDQ分治。
  • 典型例题

三、子序列与排列问题

关注按顺序但不一定连续的元素构成的问题。

3.1 经典子序列模型

问题特点:最长上升子序列(LIS)、最长公共子序列(LCS)及其各种变体。

  • 核心知识点:动态规划、贪心+二分(LIS优化)、状态机DP。
  • 技巧
    • LISdp[i] 表示以 i 结尾的长度,可优化为维护一个“最小末尾数组”并用二分查找。
    • LCS:经典二维DP。若两个序列都是 1~n 的排列,可转化为 LIS 问题。
  • 典型例题

3.2 排列相关问题

问题特点:序列本身是 1~n 的一个排列。常利用排列的唯一性和值域特性。

  • 核心知识点:置换环、逆序对、排列的字典序、构造。
  • 技巧
    • 排列上的计数:常以值域为索引,简化状态。
    • 排列的变换:通过交换相邻或任意元素达到目标,常与逆序对或置换环分析相关。
  • 典型例题
    • P1525 关押罪犯:虽不是纯序列题,但体现了利用矛盾关系(可视为二分图)进行排序后贪心的思想。
    • CF1768D Lucky Permutation:分析排列的置换环与逆序对奇偶性。
    • P1088 火星人:求排列的下一个字典序排列(next_permutation 原理)。

四、序列变换与匹配问题

关注如何将一个序列变为另一个,或寻找特定模式。

4.1 字符串匹配

问题特点:在文本串中寻找模式串的出现位置。是序列问题的特例,但极为重要。

4.2 序列比对与编辑

问题特点:求两个序列的相似度,或通过最少操作(增、删、改)使序列相同。

  • 核心知识点:动态规划(编辑距离模型)、LCS的扩展。
  • 典型例题

五、特殊序列与高级技巧

5.1 特殊序列

问题特点:序列本身具有特殊结构,如括号序列、循环序列、山脉序列等。

  • 核心知识点:栈、贪心、特定性质(如合法括号序列前缀和>=0)。
  • 典型例题

5.2 高级技巧综合

问题特点:综合运用多种数据结构与算法思想。

  • 涉及技巧:扫描线、离线处理、分治(CDQ、整体二分)、线段树优化DP、斜率优化、wqs二分等。
  • 典型例题

解题思路总结与索引

遇到序列问题,可遵循以下思考路径:

  1. 判断问题本质:是连续区间还是子序列?是静态还是动态?是查询、修改还是计数/最优化?
  2. 分析操作类型
    • 静态查询:考虑前缀和、ST表、主席树、莫队。
    • 动态修改:考虑树状数组、线段树。
    • 区间修改:必须线段树懒标记。
    • 子序列/排列:考虑DP、贪心、置换环。
  3. 观察数据范围
    • n <= 10:指数级搜索/状压DP。
    • n <= 1000:O(n²) DP或朴素算法。
    • n <= 10^5:O(n log n) 算法,如线段树、树状数组、单调栈、排序+扫描。
    • n <= 10^6:O(n) 算法,如双指针、单调队列、KMP、差分前缀和。
  4. 寻找特殊性质:是否为排列?是否有序?是否具有单调性?可否差分/前缀和转化?
  5. 回顾经典模型:问题是否可归约为逆序对、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)

文档说明:本指南试图构建一个从基础到进阶的序列问题分析框架。实际题目往往是多个类别的结合,关键在于准确识别其主模型并灵活运用技巧。持续练习和总结是提升解题能力的唯一途径。

posted @ 2026-01-11 13:13  Chestify  阅读(35)  评论(0)    收藏  举报