信息学奥赛一本通(提高组)

一、贪心算法

  • 选择不相交区间问题:给定n个开区间,选择尽量多个区间,是得这些区间两两没有公共点。(例:活动安排)

  按照结束时间由小到大的顺序排列,依次考虑各个活动,如果没有和已经选择的活动冲突,就选;否则就不选。

  • 区间选点问题:给定n个闭区间,在数轴上选尽量少的点,是得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。(例:种树)

  首先按照区间的结束位置从小到大排列。然后在区间中进行选择:对于当前区间,若集合中的点不能覆盖它,则将区间末尾的数加入集合。

  贪心策略:取最后一个。

  • 区间覆盖问题:给定n隔壁区间,选择尽量少的区间覆盖一条指定的线段区间。(例:喷水装置)

  将所有区间按照左端点由小到大排序,依次处理每个区间。每次选择覆盖点s的区间中右端点坐标中最大的一个,并将s更新为该区间的右端点坐标,直到选择的区间包含t。

  贪心策略:在某时刻的s,找出一个满足a[i]<=s的b[i]最大值即可。

  • 流水作业调度问题:n作业,两机器,先a后b,求总时间最短。(例:加工生产调度)

  直观:让a没有空闲,让b空的少

  Johnson算法:对于a=b的集合,按照b非升序排列

  • 带期限和罚款的单位时间任务调度:n任务,每个都能在单位时间内完成,每个都有对应的完成期限及完成不了的罚款数额,确定执行顺序使罚款最少。(例:智力大冲浪)

  按照罚款数额由大到小排序,然后依次进行安排。安排规则为:使处理当前任务的时间在既在期限之内,又尽量靠后,如果都已经排满,则放弃处理并扔在最后.

二、二分(单调性)与三分(单峰性)

  • 二分的边界问题https://www.luogu.org/blog/tarjanfloydDP/qian-tan-er-fen-di-bian-jie-wen-ti
  • 二分常见模型二分答案(将最优化问题转为判定性问题),二分查找(求解分界点),代替三分(二分导函数求极值,定义域通常定为整数域)。
  • 三分:任取两点判断好坏不断缩小区间。

三,搜索

  • dfs的优化技巧优化搜索顺序(对象),排除等效冗余,可行性剪枝(上下界剪枝),最优性剪枝,记忆化。

  例:数的划分,生日蛋糕,小木棍,weight,Addition Chains。「一本通 1.3 练习 1」埃及分数

  • 双向bfs等

四、图论

  • 最小生成树:

   prim(堆优化),kruskal:prim适用于疏密图,kruskal使用于稀疏图。例:北极通讯网络。

    一些相关拓展最短路径生成树(例,黑暗城堡),次小生成树,严格次小生成树

  • 最小环问题

    对于无向图,考虑Floyd,枚举与k相邻的两个点求解最小值。

       对于有向图,考虑dijkstra,从1到n中枚举s,s是堆中第一个取出的结点,扫描所有出边,更新完成后使d[s]为无穷大,当s第二次被取出时,d[s]即为所求。

  • 最短路

     Floyd:可处理无向与有向图,边权可正可负,不能有负环。可求解最小环。每对点之间。

     dijkstra(堆优化)处理非负边权。单源。代码。

     Bellman-Ford:单源,可解决负边权

     SPFA(队列优化的Bellman-Ford)可判断负环,稀疏图上效率较高,稠密图易退化,输出路径可用数组记录(注意倒序输出)。代码

  • 最短路计数问题:在所使用的求最短路的方法中加上计数操作即可。代码
  • 差分约束:可转换为有向图的路径问题,例题详见博客,感觉差分约束还是比较容易看出来的
  • 强连通分量:使用tarjan算法,用途:有向图的缩点,解决2-SAT问题
  • 割点和桥
  • 欧拉回路

五、字符串

  • 哈希:双哈希(选取孪生质数),自然溢出
  • KMP算法线性,单模式串匹配,代码
  • 字典树(Trie)
  • AC自动机:trie上的kmp,多模式串匹配
  • manacher(马拉车)算法:判断回文串

六,数据结构

  • 树状数组
  • RMQ问题:ST算法,以及与线段树的比较
  • 线段树及其拓展:zkw线段树
  • 倍增求LCA:倍增三连击orzzz,处理数组时注意从前或者从后处理,基本不会单独考出来,一般在树上跑倍增qwq
  • 树链剖分(再说)
  • 平衡树(Treap)(再说)

七、动态规划

  • 区间dp:分解合并求解,阶段特征明显,类似分治,f[i,j]=max(f[i][k]+f[k+1][j]+决策),k为划分点
  • 树形dp:基本模型都是一棵树或者森林。仔细考虑每个节点有什么状态,这些节点的状态与父节点子节点的状态都有什么联系,也就是如何由子结点的最优值推出父结点的最优值。

      经典问题:树的重心:以重心为根的有根树的最大子树的结点数最小。

           树的最长路径(最远点对):找到距离最远的两个结点。

           树的中心问题:中心到树中的其他结点的最远距离最近。

           普通树形dp:考虑状态,取或不取。

      一些类型:由根分成左子树和右子树两部分:考虑左子树为空,右子树为空,左右子树都非空三种情况

           背包类树形dp:一般以结点编号作为树形dp,“体积”作为第二维状态

           求树的最长链问题:对于每个结点i记录以i为根的子树到叶节点的最大距离及次大距离,不断更新,最后相加取最大值

           求树的最大独立集:考虑每种状态下的策略问题,从而推出转移方程

           普通树的dp:依旧是考虑每个节点的状态,考虑该状态下的策略

  • 数位dp
  • 状压dp
  • 单调队列优化dp
  • 斜率优化dp

八、数学基础

  • 快速幂:连续分解
  • 质数:算术基本定理,质数分布定理,质数判定及筛法,质因数分解
  • 约数:求1~n每个数的正约数集合(Antiprime数)
  • 同余问题
  • 矩阵乘法
  • 组合数学
  • 博弈论

转载于:https://www.cnblogs.com/Aze-qwq/p/9485296.html

你可能感兴趣的:(信息学奥赛一本通(提高组))