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


    一、贪心算法

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

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

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

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

      贪心策略:取最后一个。

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

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

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

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

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

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

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

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

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

    三,搜索

    • 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问题
    • 割点和桥
    • 欧拉回路

    五、字符串

    六,数据结构

    • 树状数组
    • 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数
    • 同余问题
    • 矩阵乘法
    • 组合数学
    • 博弈论
  • 相关阅读:
    匿名字段和内嵌结构体
    Go函数式编程的闭包和装饰器设计模式
    理解Golang中defer的使用
    Go匿名函数及闭包
    GO语言学习笔记-缓冲区Channels和线程池
    你需要知道的关于Neutron的一切事情
    []T 还是 []*T, 这是一个问题
    Golang 方法接收者为值与指针的区别
    第九章 python语法入门之与用户交互、运算符
    第八章 python语法入门之垃圾回收机制
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9485296.html
Copyright © 2020-2023  润新知