原名:算法竞赛一句话解题&经典问题分析 ©ntsc 2024
处理进度
- 绿:P1381【~P(今日进度)】
- 蓝:P1099
致CSDN网友:
本文章不定期更新!文章链接:
经典问题分析
基础知识与编程环境
- 了解树的中序遍历的性质来设计算法→P1040
思维
-  考虑每一个数字的贡献而不是考虑每一种情况那个数字做贡献→mna.816/p4 
-  观察数据访问,发现一个范围很小→将这个数据作为最外层循环,每次考虑这个数据取特定值时的答案的求解→P1311 
-  求最优化一个计算式,并且里面有一个值需要你来确定,并且不好直接求→二分→优化每一次计算过程→O(n)求多个询问区间内>m的数字的个数之和→先把≤m的数字赋0,然后跑前缀和,再对每个询问O(1)处理→P1314 
-  将字符串哈希后离散化→双指针,右端点不断扩散(右移),左端点贪心地缩小(右移)→P1381 
STL 模板
排序算法
-  在DAG中,更新一个点的信息如果需要先更新其来点→拓扑排序→P1038 
-  一些偏序问题(非计数类),考虑拓扑排序进行顺序确定→考虑不同情况反映在DAG中的情况→一定有序:存在n长链/错误:有环→P1347 
搜索算法
-  O ( 2 40 ) O(2^{40}) O(240)的搜索→Meet in the middle 
-  数据范围小的时候可以考虑直接搜索(填表)→P1004 
-  有些时候看上去n不适合搜索(e.g. n=50),但是加上剪枝也许就是正解→剪枝优化时间复杂度的证明和计算→P1034 
-  常见数矩阵个数优化(n4变n3)→P1191 
-  结合计算性质进行剪枝→P1092 
-  枚举→P1378 
图论算法
-  应用分层图思想【模型】→P1073 
-  记录附加信息的最短路→P1078,P1144 
-  给定关系求层级数最小值→先整理出约束(e.g. A在B之上),连有向边→求最长链→拓扑排序→P1983 
-  总结出最后的图的特点→生成树→最大生成树→证明某些很难解决的情况不存在→简单解决→P1265 
线性结构
集合与森林
-  使用并查集额外维护集合信息→将集合信息统一整理至某一个集合的代表元素上去,注意清空过期的代表元素→P1196 
-  断边维护连通块个数→化断边为加边→P1197 
树形结构
-  维护树链上的信息→树上倍增,树剖 
-  维护子树信息→dfn线段树 
-  从题目中整理出树的性质→设计树形dp进行最优方案求解→P1131 
-  结合数据范围,预估复杂度→搜索→设计搜索→因为每一层只能切断一个,所以就可以对每一个节点搜索其最优的切断方式(使用回溯的数据来贪心选择)→P1041 
-  理清题意→整理出答案的几种来源/情况→对于每一种情况独立思考做法,最后组合起来→P1099←答案有两种情况:来自直径两端,来自最长的侧链。并且来自最长的侧链的那个答案只需要计算侧链端点到直径的距离即可。不需要考虑侧链+一部分直径的情况,因为如果这种情况可以作为答案,那么直径就要改了! 
数据结构
-  动态维护数字序列信息→权值线段树→P1168 
-  线段树模板→P1198,P1253 
算法策略
- 维护4指针2区间信息→莫队,将4指针拆为2指针及多个询问→P5268
字符串算法 哈希表
动态规划
-  用“非法情况一定更劣”来消去需要考虑非法的情况→P1006 
-  dp不就是枚举情况并选最优吗?→P1040 
-  断环为链→P1043,P1063 
-  题目中有明显的“合并”流程,则考虑区间dp→P1063 
-  依赖背包嗯可以看成树形dp来做,如附件数量很少则可以枚举每个主件和附件的配对情况并作为一个物品的多种情况。当遇到一个物品有多个挡位时的背包问题也可以参考本题→P1064 
-  从题目信息中构造出背包(f_{i,j})的物品(i)及两个维度(价值(f)和容量(j))→P1156,P1282 
-  考虑树形dp并考虑复杂度→P1273 
-  主要考验dp转移的设计以及dp优化→思维→P1070 
-  一开始考虑贪心→给定方案计算答案很快→不好实现,所以使用搜索(计算每一种可行情况)→使用dp实现记忆化搜索→压维优化→P1284 
-  期望dp→得出概率的计算式→使用dp求出计算式中的值并计算→本题:第i题对的概率=i-1题答案=i题答案→P1297 
-  树形dp,最大权独立集→P1352 
数学与其他
初等数学
-  总结出性质来优化枚举的复杂度→P1072 
-  要勤于推导式子→推导后得出贪心算法而不是一开始选择dp→P1080 
初等数论
-  扩展欧几里得变形与理解→P1082 
-  矩阵乘法→P1349 
离散与组合数学
线性代数
高等数学
最优化
-  博弈论→P1247 
-  舞蹈链及其变形→P1074