高一寒假竞赛知识点梳理1
世界以痛吻我,要我报之以歌。
——拉宾德拉纳特·泰戈尔
我热爱生活,我是一名快速成长的OIer
目录:
动态规划入门
知识点:
- 背包问题(动规最基础问题)
- 01背包(二维化滚动,滚动化一维,注意循环顺序与初始化)
- 完全背包(完全化01,01化倍增,或化为一维,注意循环顺序)
- 多重背包(倍增)
- 分组背包(注意循环组数+金钱+组员,一维动规 )
- 二维费用背包(双管齐下,二维注意循环顺序)
- 有条件的背包(直接枚举)
- 区间DP(注意循环层数+起点+影响因素,二维动规 )
memset(f,0,sizeof(f));//01背包不恰初始化
memset(f,-127,sizeof(f));
f[0]=0;//01背包恰取初始化
经验与教训:
- 抄书问题与最大子矩阵,可用前缀和“降维”
- 01背包与完全背包的拓展顺序
- 倍增思想很重要
- 多次用转移方程是必然趋势,思路要更加清晰,不要吝惜草稿纸
数据结构
知识点:
- 栈
- 树基础(建树,遍历)
- 二叉树(结点性质)
- 指针
- 手写二叉堆(建堆 O(nlogn) ,取顶 O(logn) )
- 图论
- 概念(有向图无向图权值度环DAG有向无环图拓扑排序强连通分量邻接矩阵邻接表前向星稠密图稀疏图)
- 最短路
- 多源最短路Floyd(dp O(n3) ,顺序kij)
- Dijkstra( O(n2) ,可加堆优化)
- Bellman-Ford( O(VE) ,浪费过大)
- SPFA( O(kE) ,高效但不稳定(有点像quicksort))
- 并查集(找爸爸时接短路)
- MST最小生成树
- prim( O(n2) ,最优感染法)
- kruskal( O(n2) ,dijkstra改编)
经验与教训:
- m和n千万不要搞混,尤其是定义MAXN与MAXM取值与数组的“定位“(按边还是按点),与循环i<=n与j<=m(可用i与j区分防混)
- 慎用memset
- 根据实际情况定义MAXN和MAXM,无向图注意MAXM>=m*2(MLE很惨痛,崩溃更惨痛)
- 注意起止点设置,切勿答非所问
- 遍历一张图,要注意图可能不会联通,故只for一遍通常不够( 血的教训)
- 点权附同边权计算时,注意细节处理(包括结束的点)
附录: 寒假A题表1
Problems | Aspect | 时间复杂度 | Notes |
---|---|---|---|
light | 背包 | O(n3) | 滚动数组每次清零 |
money | 背包 | O(n3) | i>=0时f[i]才有意义 |
energy | 区间 | O(n3) | 循环顺序 |
合并果子 | 区间 | O(n3) | 循环顺序 |
最大差值 luogu | 贪心 | O(n) | 水题 |
漂浮的鸭子 luogu | dfs(染色) | O(n) | 并查集思想 |
随机数生成器 luogu | MATH | O(n) / O(1) | 见下 |
找根和儿子 | 树 | NULL | 指针 |
word | 树 | NULL | 可用sort作弊 |
fruit | 堆,队列,SORT | NULL | NOIP2004 |
lift | 队列 | NULL | bfs初始状态 |
produce | 队列 | O(n2) | 判位长 |
前中求后序 | 树 | O(n2) | 纲举目张 |
扩展二叉树 | 树 | O(n) | print判空 |
drop | 树 | O(logn) | 判断单词位长 |
flist | 树 | NULL | 纲举目张层序 |
线段树 | SUPER | NULL | 调调调。。。 |
bfs最短路 | bfs | O(n+E) | 适时跳出 |
money | dijkstra | O(n2) | 注意起止点 |
堆排序 | 二叉堆 | O(nlogn) | 上蹿下跳 |
short | floyd | O(n3) | 初始化 |
最短路 | dijkstra+堆 | O(nlogn+) | 不断更新 |
butter | SPFA | O(nkE) | 无向边做两条边 |
最小生成树 | prim | O(n2) | 无向边做两条边 |
color 练习赛 | bfs(染色) | O(n) | 外循环n次 |
book 练习赛 | SPFA | O(kE) | 点权处理 |
teacher 练习赛 | 并查集+分组背包 | O(nW) | 链表顺序 |
最小生成树 | prim | O(n2) | 可跳边优化 |
最小生成树 | kruskal | O(n2) | 注意更新条件 |