常见优化技巧_解题技巧

双指针

技巧

使用前提是,该区间已具有单调性,一般来说是贪心策略

有两种写法:

  • 左闭右闭:两边界情况必须可取,当前条件的处理与可行性判定在本次完成

  • 左闭右开:左边界情况可取,右边界情况不可取;

    参考DFS的构造,每次处理当前条件,但可行性判定可留到下一次,精简代码逻辑;

    求区间长度方便,r - l即可

练习题

空间换时间

练习题

  • P7072 计数排序/桶排序,典型的空间换时间
  • P2671 复杂的数学公式展开后,再合并同类项找规律,也很经典

排序的优化

练习题

  • P7910 在有序数组内修改一个数,可通过\(O\left( n \right)\)的打擂台将其放在合适的位置

最大子矩阵

技巧

共两种方法:

  • 悬线法或单调栈法,依赖于长宽的大小;
  • 障碍物法,依赖于障碍物的个数;

上述几个方法都是\(O\left( n^2 \right)\)的时间复杂度,所以长宽或障碍物哪个小选择哪个方法即可~

练习题

  • P4147 单调栈的绝世教学题,悬线法的模板题
  • P1950 P4147的加强版,单调栈+悬线法的绝世教学题
  • P5943 悬线法
  • P1578 障碍物法模板题

单调栈

技巧

维护区间单调性,比如”右边的元素都比我大“

和单调队列不同,偏向于破坏单调性时,反向更新单调区间内的元素

练习题

  • P4147 单调栈的绝世教学题
  • P1950 P4147的加强版,单调栈+悬线法的绝世教学题
  • P2866 统计元素出栈时,对答案的贡献
  • P3467 P4147的简化版

单调队列

技巧

维护区间单调性,比如”右边的元素都比我大“;常见于滑动窗口

和单调栈不同,偏向于维护区间极值

练习题

  • P2216 维护区间最大经典例题

  • P2032 维护区间最大,模板题

  • P1886 维护区间最大、维护区间最小的模板题

  • P1714 前缀和+区间最大

  • P1725 DP+区间最大

  • acwing-135 前缀和+区间最小

前缀和

技巧

多用于频繁询问满足容斥原理区间和的优化

练习题

  • P8218 一维前缀和模板题
  • P1719 二维前缀和模板题+最大子段和
  • P2004 二维前缀和模板题
  • P1314 答案二分+前缀和优化
  • P3017 答案二分+前缀和优化

差分

技巧

用于区间修改,\(O\left( 1 \right)\)的区间修改时间复杂度,\(O\left( n \right)\)的区间查询时间复杂度

练习题

  • P2367 一维差分模板题
  • P3397 二维差分模板题
  • P3406
  • P1083 二分+差分
  • P2882 贪心+差分,贪心的好题,最小反转次数问题
  • P4552 贪心+差分

离散化

技巧

数据点范围极其庞大,但只需要用到数据点本身,不需要在数组上表达两点之间的具体区间。

练习题

  • P1496 离散化的模板题+差分
  • P1955 离散化+并查集
  • P5937 离散化+并查集
  • P1884 P1496的二维升级版本
  • P1904 离散化+扫描线