收获
- 练习了将一个二元组当做图上的一个点(即拆点),然后建图求最短路的问题以及其它几个非模板的最短路问题;
- 复习并练习了有向图的强连通分量,tarjan缩点;
- 复习了tarjan求割点;
- 学习并练习了无向图的点双联通分量,割顶与桥,学习了边双联通分量,在理论上复习了有关欧拉回路的知识;
- 学习并整理了2-SAT问题,以及三元约束通过枚举转换成二元约束,noi2017游戏;
- 学习了通过建立最短路树来减小在图上的枚举规模的技巧;学习了求无向图中的团与最大独立集的方法 ;
- 复习并练习了差分约束系统,理解与应用超过从前,通过前缀和将和的约束转化成差的约束;
- 学习并练习了kruskal重构树,noi2018归程;
- 复习了树链剖分,优化了以前写的模板,顺带复习了最基本的线段树,;
- 在杂题的练习中复习了状压DP,简单的双向TSP;求无向图的简单环个数(压缩路径上经过的点,通过规定起点以及一个状态中仅在起点处计算环来避免重复计算,上个月的DP练习中有接触过这种思想),练习了较低难度的贪心;
- 写出来不少写前感到头大棘手的题,调试能力与代码能力应该有点进步吧;
- 本月AC 41题,蓝紫为主;
经验方面
- 处理链表时可以在0和n+1处添加虚拟位置方便处理,但是要注意在调用时“消掉”虚拟位置中的元素;
- 注意kruskal中并查集的合并操作是a[find(a[u])]=a[find(v)],而不是a[u]=a[v];
- 拿过一道题一定要先自己思考,哪怕知道这个难度的题目的正解自己一定想不出来,当看到自己的思考能对接紫书上的一些讲解时多少也会有些成就感;
- 使用位运算时多用括号比较保险,这个优先级哪怕在赋值语句里也真的很迷。。。
- 多组数据跑图论算法别忘重置cnt;
- 动态规划中关于状态的思想完全不必拘泥于动态规划!
- 打破对于传统条件的思维惯性!看清题目对与每个条件的描述!比如“i,j之间”并不意味着i<j;n个点并不意味着点的编号是1~n;
- 不要忽略静态差错的作用,往往能节省不少时间;
- 注意建图时的下标不要搞错!!!!!!!!!(半个小时同一个坑掉两次说明已经养成错误使用下标的习惯了),基础的地方不要写错;
- 学东西别吊死在一篇博客或论文上;
- 对一个算法的正确性存疑或者认为流程不够清晰时,手动模拟一下是个不错的办法;
- 差分约束系统:将题目条件转化成等价不等式,利用这些等价不等式和隐含不等式建图;
- 把初始化写成函数之后不要忘记调用。。。好几次了。。。
- 字符串的读入问题,最好用10000%正确的写法,比如SDOI2011染色,只用getchar()把回车读掉提交上去会出问题;
- 注意数组越界问题:在递归函数中越界有时程序不会异常,而是在越界的时候读取其他元素(noi2018归程);
其他
- 关于线段树:对x的pushdown是针对x的儿子而言的,对x的pushup针对的是x,因此在update时先pushdown,再pushup,query时只需要pushdown;查询区间时的方向性,一次query先左后右,在树链上时对于同一边先右后左,染色那个题判断边界颜色更新答案用到了这个性质;
- 位运算确实很多地方用的不熟练,得抽个时间集中整理一下;
- 总的来说目标基本完成,拓展部分学习了克鲁斯卡尔重构树,但是树链剖分练习过少,边双联通分量没有去写;下个月目标:
学习(fu xi)网路流,刷完洛谷的网路流24题,另外再练习 几道有关网路流的区域赛原题;