【算法 1-1】模拟与高精度
P1601、A+B Problem:高精加
1 |
|
P1303、A*B Problem:高精乘
1 |
|
P1009、阶乘之和:高精乘 + 高精加
1 |
|
P1591、阶乘数码:高精乘,遍历计数
P1045、麦森数:高精乘,取后 500 位即可
P1249、最大乘积:因数越多乘积越大,和比该数大一则去掉 2,末因数 + 1;和比该数大 k 则去掉 k;注意 3 和 4 两个特例
P5461、赦免战俘:分形题,经典递归
【算法 1-2】排序
P1271、选举学生会:桶计数
P1177、快速排序
1 |
|
P1923、求第 k 小的数:经典 kth 问题
1 |
|
P1093、奖学金:结构体排序
P1781、宇宙总统:结构体排序
P1068、分数线划定:结构体排序
P5143、攀爬者:结构体排序
P1104、生日:结构体排序,注意 c++ 中稳定排序为 stable_sort()
P1012、拼数:注意本题非贪心,不能简单用字典序排序;本题使用了一个巧妙的字符串拼接比较方法
1 |
|
P1908、逆序对:基于相邻元素比较的排序算法中元素交换次数,本题数据规模大,使用归并排序
1 |
|
【算法 1-3】暴力枚举
P2241、统计方形:遍历长宽,相等即方形,乘数计数
P2089、烤鸡:约束型 dfs,全遍历
1 |
|
P1618、三连击(升级版):暴力 9 位数全排列即可
P1036、选数:dfs,无重升序扫描,因为不需要保存路径所以 dfs 的过程可以简化
1 |
|
P1157、组合的输出:无重升序扫描,模板题
1 |
|
P1706、全排列问题:全排列模板题,可以用 next_permutation
逃课
1 |
|
P1088、火星人:全排列的第 k 种情况,dfs 或逃课
P3392、涂国旗:三重循环暴力枚举
P3654、First Step:网格搜索,注意是直线,不能在 dfs 内部扩展
1 |
|
P1217、回文质数:埃筛判断是否为回文数即可
P1149、火柴棒等式:打表,暴力枚举即可
P3799、妖梦拼木棒:暴力枚举两条短边
P2036、PERKET:dfs,每个状态结点分选和不选两种状态,决策树的雏形
1 |
|
【算法 1-4】递推与递归
【算法 1-6】二分查找与二分答案
二分答案的标准例程
1 |
|
P2249、【深基13.例1】查找:有序数组二分查找
1 |
|
P1102、A-B 数对:转换为 A - C = B
,标准 $f(X)\in X$ 问题
1 |
|
P1873、砍树:二分答案
1 |
|
P1678、烦恼的高考志愿:查询前驱即可,善用 STL 逃课,lower_bound(a + 1, a + 1 + n, t) - a - 1
指示前驱位置;upper_bound(a + 1, a + 1 + n, t) - a
指示后继位置
P2440、木材加工:二分答案
P2678、跳石头:双指针扫描,贪心删数(删当前数右边一位);二分答案求最短跳跃距离的最大值
P3853、路标设置:二分答案
P1182、数列分段 Section II:二分答案
【算法 1-7】搜索
P1219、八皇后:经典 dfs,八皇后的线性 vis 很值得回味
1 |
|
【数据结构 1-1】线性表
P3156、询问学号:签到题 P3613、寄包柜:数据稀疏,使用哈希
1 |
|
P1449、后缀表达式:栈经典习题
1 |
|
P1996、约瑟夫问题:队列经典习题
1 |
|
P1160、队列安排:频繁的插入删除,链表题
1 |
|
P1540、机器翻译:页面置换,由于涉及到遍历查找,使用 vector
模拟队列
1 |
|
P2058、海港:顺序维护区间无重复计数,使用队列存储,判断队首元素是否满足区间要求;使用桶来完成计数
1 |
|
P1241、括号序列:对每一个右括号,找到在它左边最靠近它的左括号匹配,不匹配则补全;扫描,左括号入栈,右括号看是否和栈顶符号匹配
1 |
|
P4387、验证栈序列:栈模拟
1 |
|
P2234、营业额问题:大规模数据,多次查找某数的前驱和后继,该题数据使用 BST 会卡常,需要使用平衡树,可用 multiset
逃课
1 |
|
【数据结构 1-2】二叉树
P4715、淘汰赛:亚军,平分后在线选取左/右最大元素比较即可
P4913、二叉树深度:签到题
P1827、美国血统:给出中序和前序遍历,求后序遍历,经典递归习题,注意子树的字串长是相同的
1 |
|
P5076、普通二叉树(简化版):二叉搜索树 BST 模板题,偷懒可用 multiset
逃课
1 |
|
P1364、医院设置:带权树的重心,本题数据很水,可用 Floyd 逃课
1 |
|
P1229、遍历问题:给出前序和后序遍历,求中序遍历有几种情况,显然只要存在单子节点即有两种情况
1 |
|
P1305、新二叉树:前序遍历,签到题
P1030、求先序排列:给出中序和后序遍历,求先序遍历,经典递归习题
1 |
|
P3884、二叉树问题:求二叉树深度、宽度、节点间距离,经典树习题
1 |
|
P3369、普通平衡树:splay 模板题
1 |
|
【数据结构 1-3】集合
P1551、亲戚:并查集模板题,find(i)
表示 i 节点的祖先节点
1 |
|
P1536、村村通:并查集,祖先节点个数减一即修路条数
P3370、字符串哈希:模板题,进制哈希,可使用 unsigned long long
自然溢出自动对 2^64-1 取模;哈希题偷懒可用 unordered_map
逃课
1 |
|
P3405、Cities and States S:逆序对计数
1 |
|
P5250、木材仓库:set
练习题,也可作为平衡树练习题
P5266、学籍管理:map
练习题,unordered_map
的查找性能要远优于 map
P1102、A-B 数对:R(S) = S,用桶保存结果比较即可;数据规模过大时使用哈希表代替桶
P1918、保龄球:高性能查找,BST 和二分查找的练习题,偷懒可以用 map
逃课
P1525、关押罪犯:贪心,尽可能让愤怒值高的罪犯不共边,并查集补集思想,敌人的敌人就是我们的朋友
1 |
|
P1621、集合:埃筛 + 并查集,注意是公共质因数,唯一分解定理可证明这种算法的正确性
1 |
|
P1892、团伙:并查集补集问题
P1955、程序自动分析:大范围数据,离散化 + 并查集,很不错的练习题
1 |
|
P4305、不重复数字:结构体离散化应用,本题也可作为哈希表练习题
P3879、阅读理解:map
练习题,也可以做 Trie 树练习题
1 |
|
P2814、家谱:哈希表 + 并查集
【数据结构 1-4】图的基本应用
P5318、查找文献:图的 dfs 与 bfs,涉及了节点排序不建议使用链式前向星
P3916、图的遍历:能到达的最大的节点,反向建边 + dfs
1 |
|
P1113、杂务:拓扑排序,因为本题数据输入是有序的,可以不建图在线 dp,转移方程为 dis[v] = max(dis[v], dis[u] + w[v])
P4017、最大食物链计数:拓扑,转移方程为 f[v] = f[v] + f[u]
P1807、最长路:拓扑,转移方程为 dis[v] = max(dis[v], dis[u] + w[v])
,注意事先要删除除 1 外入度为零的节点,生成单源图
1 |
|
P2853、Cow Picnic S:dfs,可抵达数等于牛数目即该节点可被所有牛访问
【数据结构 2-1】二叉堆与 ST 表
【动态规划】动态规划的引入
P1048、采药:01 背包,逆推,dp[j] = max(dp[j], dp[j - w[j]] + v[j])
P1616、疯狂的采药:完全背包,顺推,dp[j] = max(dp[j], dp[j - w[j]] + v[j])
P1115、最大子段和:经典 DP,可以在线处理,状态决策为 t > t + maxCur
P2392、kkksc03考前临时抱佛脚
P1216、数字三角形:当前层数值只与上一层数值及其左边一位数有关,所以可以在线 DP 逆推,转移方程为 dp[i] = a[i] + max(dp[i], dp[i - 1])
P1434、滑雪:记忆化 + 暴搜,记忆化顾名思义即开辟一个额外的答案数组实时存储 dfs 的结果
1 |
|
P2196、挖地雷:前驱节点要在后继节点之前遍历完毕,转移方程为 f[v] = max(f[v], f[u] + a[v])
,用 pre 数组存储路径前驱
1 |
|
P1802、5 倍经验日:01 背包,dp[j] = max(dp[j] + lose[i], dp[j - use[i]] + win[i]);
,注意打不赢都要加上输掉的经验
P1002、过河卒:棋盘 DP,注意限制条件
P1521、求逆序对