C++竞赛基础算法 + 数据结构
首先声明!!!
- 1、此知识点为课堂总结内容;
- 2、如有使用或转载请注明出处;
- 3、如有不足,欢迎批评指正;
* 基础算法 + 数据结构大纲:
一、基础算法:
- 1、前缀和(一维、二维);
- 2、差分(一维、二维);
- 3、二分(整数二分、小数二分);
- 4、双指针(头双、头尾、分开);
- 5、高精度算法(用的比较少);
- 6、贪心思想;
二、数据结构:
- 1、链表(数组实现、map实现);
- 2、栈、队列(单调栈、单调队列)
- 3、树(存储、堆、递归、并查集)
- 4、图(存储)
三、搜索 + 图论;
- 1、dfs搜索;
- 2、bfs搜索(连通块);
- 3、拓扑排序;
- 4、最短路:单源最短路(dijkstra、spfa)、多源最短路(Floyd);
- 5、最小生成树(kluskaer);
四、数论:
- 1、gcd、lcm;
- 2、判断质数、分解质因数;
- 3、筛质数(埃氏筛法、线性筛);
- 4、欧拉定理(欧拉函数);
- 5、逆元、取模;
- 6、组合数;
- 7、博弈论;
五、动态规划(DP):
- 1、背包(0/1,完全背包、多重背包);
- 2、最短(上升|下降)子序列;
- 3、线性dp(一维、二维);
- 4、区间dp;
- 5、状态压缩dp;
- 6、树形dp;
* 这些都只是基础算法 + 数据结构(之后有中级、高级)
基础算法篇:
一、前缀和:
1、作用:q次查询的求区间和(O(1));
- 预处理出s[i]数组;
- 查询只用s[r]-s[l-1];
- 注意:下标从1开始;
2、缺点(局限性):
- 只做查询,不能修改;
- 查询的区间必须是连续的;
3、常见的有一维前缀和、二维前缀和:
一维前缀和C++代码模板:
1 | cin>>n>>m; |
二维前缀和C++代码模板:
1 | cin>>n>>m>>q; |
二、差分(前缀和的逆运算):
1、作用:q次修改区间加上或减去固定的值(O(1));
- 预处理出c[i]数组;
- 查询只用修改c数组;
- 最后还原原数组;
- 注意:下标从1开始;
2、缺点:
- 修改的值是固定的(加|减);
- 修改的区间必须是连续的;
3、常见的有一维差分、二维差分:
一维差分C++代码模板:
1 | cin>>n>>m; |
二维差分C++代码模板:
1 | cin>>n>>m>>q; |
三、二分(号称最难的算法):
1、整数二分:
- 边界问题(记模板);
- 符合和不符合的区间查找;
2、小数二分:
- 没有边界问题,只需要设置查找精度;
- 符合和不符合的区间查找;
3、二分答案:
- 最大最小 | 最小最大问题
- 条件限制问题
C++代码模板
1 | //整数二分: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 1025's Blog!
评论
ValineDisqus






