NOIP/CSP各种技巧思路合集

DP 类

  • 累加和的 DP 数组可以前缀和优化。
  • 滚动数组优化。
  • 单调队列优化。
  • 斜率优化。
  • 遇到 DP 状态类似“ \(dp_i\) 表示第 \(i\) 个元素必选的 xxx 代价 ”时,可以在后面加上一个空元素,以 \(dp_{n+1}\) 作为答案。
  • 要求答案恰好选择 \(m\) 个物品(或数字之类),可以初值赋值成-INF,给最初状态赋值成 \(0\)(比如dp[0]=0;)。最简单的例子就是背包要求空间恰好\(m\)
  • 矩阵优化。
  • 倍增优化。
  • 卷积,生成函数,数学方法求出通项等。
  • 题目要求满足整除某个数字等条件,记录一维余数的大小。
  • 对卡特兰数要敏感。(看出来了基本就是白捡分啊)

区间类

  • 差分,轻松将区间加等差数列改成区间加和。
  • 对于一个区间 \([l,r]\),可以转化成前缀和相减的形式入手。
  • 扫描线思想,线段树上二分。
  • 把树形结构转化成 dfs 序区间,可以搭配线段树区间维护。

树上问题类

  • 无论何时要考虑树为链的特殊情况。没思路的话可以作为切入点,写正解的话可以防止被 Hack 。
  • 树上背包:注意循环顺序。
  • 换根 DP。
  • 树上贪心:优先选 LCA 深度大的路径。

数据结构及图论类

  • 遇事不决,线段树维护。
  • 线段树上二分。
  • 线段树优化建图。
  • 扫描线思想,把二维转化成一维。
  • 遇到麻烦的情况,考虑建立超级源点或者虚点作为起点或者中转。
  • \(n,m\) 同阶时求全源最短路不要用 Floyd,要用 dijk(有负权要用 johnson 全源最短路,但应该不会那么变态

字符串类

  • Hash 写暴力很好用,常和二分结合。
  • Trie 树可以处理二进制异或问题。
  • 循环节相关别忘记 KMP 。

常数类

  • 函数多次调用的时候可以存到一个变量里。
  • 善用inline
  • register被弃用了,不知道能不能用但至少没有优化了。
  • 循环枚举时尽量降低常数。

杂类

  • 遇事不决离线试试?
  • 正难则反,补集转化。
  • 容斥原理。
  • 整体贡献转化为单独贡献。举几个简单的例子:
    • 多个图形包含了多少个点 \(\Rightarrow\) 每一个点被多少个图形包括。
  • 有关平均数的 DP,可以考虑把每个元素价值减去平均数,最简单的例子:均分纸牌。

数学类

  • 杨辉三角类似递推转成组合数计算。
  • 组合数次数太大用 Lucas 定理。
posted @ 2021-09-13 22:58  conprour  阅读(208)  评论(0编辑  收藏  举报