NOI、NOIP算法考前总结,带*为NOIP级别的比赛中涉及到的几率不大的算法
一、基础算法
一般都是前几题,会比较简单
1、模拟 注意要写准确,注意细节,简单的模拟一定要AC,复杂的模拟要先用手写清楚再开始遍 例如noip2011
mayan
2、搜索(枚举) 如dfs,bfs,同样简单的尽量AC。有些搜索需要剪枝,尽量刨去不会出现的答案
3、贪心 重点在证明,如果实在没有好的方法又不会证明可以用来骗骗分 例如noip2011
bus
4*、矩阵 关键是构造出正确的矩阵,实现很简单,范围大时要用快速幂
二、动态规划
一般每年必考至少一道
做DP题时,最好先在纸上写好状态转移方程和边界条件
1、背包 分为01背包,部分背包,完全背包等。例如 采药,金明的预算方案等
2、线性DP 这例如 添加号,ioi2003方块消除
3、坐标型DP 例如 noi99棋盘分割
4、区间型DP 例如 noip2005能量项链,noip2008传球游戏
5、树形DP 例如 皇宫看守,noi2012
park,poi-6 tro,poj1947
6、*状压DP 本质就是用一个数字表示一个状态,一般有最小表示法和括号表示法。 例如noi2001炮兵阵地,noi2007生成树计数,SCOI2005互不侵犯的king
7、*斜率优化DP 这类题需要手推公式,然后找到单调性。 例如HNOI2008玩具装箱,APIO2010特别行动队
三、图论
这类题种类非常多
1、最短路 必会的算法,spfa,dijkstra,dijkstra注意用堆优化,尽量用dij+heap而不是spfa。 这类题到处都是
2、最小生成树 稀疏图用kruskal,稠密图用prim,prim也可以堆优化
3、LCA 会一种求LCA的方法就够了,比如Tarjan的离线算法,时间复杂度是O(n+Q)。 例如BZOJ1776
4、强连通分量 Tarjan算法。 例如BZOJ1051
5、欧拉路的问题 例如 sgu101
6、二分图最大匹配 重点是建模。例如BZOJ1059,BZOJ1433,BZOJ1562
7、*最小费用最大流 重点同样是建模。例如noi2012delicacy,sgu185
四、数据结构
NOIP涉及的较少
1、 栈 队列 堆 都是基本算法,必须掌握
2、 并查集 例如 亲戚,noi食物链,BZOJ1015
3、 字典树 快速查找到字符串的方法,一般不单独出现,用来优化其它算法
4、 线段树 很常用的数据结构。例如 BZOJ1798 ,BZOJ1651,BZOJ1230,BZOJ1858
5、 *平衡树 用来维护二叉查找树的。 例如BZOJ1208,BZOJ1503,BZOJ1588
6、 *可并堆(斜堆、左偏树),有时启发式合并也不足以解决问题就要用它了。 例如APIO2012派遣
7、 *伸展树 用来维护序列的增加一个序列,删除一个序列,翻转一个序列等操作。 例如NOI2005序列维护,NOI2003editor
8、 *划分树 求区间第K大 例如poj2104
9、 *AC自动机,多串匹配的经典算法。例如noi2011阿狸的打字机
10、 *二维线段树 类似一维线段树,只不过每个节点存的是一颗线段树,实际就是线段树套线段树。例如noi2012
chess