调题的思考
能够确定自己的代码不犯SB错误,那么可以从算法漏洞开始思考,大大节省调试时间!
一定要在写的时候把标号对应清楚、字符不要打错、数组开够、inf和初值设对。渐渐养成习惯。可以减少很多调试。
调试的时候先检查这些杂事杂项,然后通读代码检查算法。
应该逐渐把调试重点放在题目和算法上
搜索/dfs
层与层之间数组混用
回溯后没有清空或者还原
边界条件设置错误
vis标记打错
数据结构
分块:
每个点对应的块,如果下标从一个开始,是ceil(i / sz)
修改区间在用一块要特判!
常数需要优化!
set:
不会用复杂的动态修改,判end和begin经常漏掉情况
DP
边界条件
不合法状态经常忘设-inf
转移方程没有推清楚,漏掉几种转移
一、多组数据
1. 清空到n + 1,要用边界外的值时,直接memset或者for的时候注意多for一点
2. 清空数组直接全部清掉。不要吝惜一点复杂度。(全清无脑)
3.
二、 提交错误
1. 记得去文件操作
2. 数据范围看清,个别数组没有开够
三、 stl使用
1. set等end没有存值,begin有值。set.erase左闭右开
2.
四、 代码sb错误
1. 不注意,变量sb打错
五、没有想清楚细节就开始写
1. 写dp前必须推清楚dp所有转移
2. 推式子的题,必须把式子完全推清楚再写(包括边界情况)
3. 想好需要实现的东西,或者需要使用的数据结构!
队伍注意事项:
注意!!
-
看题感觉奇怪 一定要看样例解释!!!看完题面要养成看样例的好习惯
-
使用python计算数组大小时,不妨直接复制结果到代码里。而不是数位数。
-
写代码前把每一个细节想清楚,不能感觉正确(今天的cdq分治对于重复数字就没有想清楚)
-
训练前留出5min调整好状态,不要匆忙开始训练
-
结论题,大胆才结论,特别是看到很多人都过了。应该意识到做法没有这么难(今天I)
读题步骤
-
读清楚题意,不要漏掉条件
-
手跑样例,确认题意
-
看清数据范围,尤其是特殊限制的情况。不要漏掉数据限制,否则简单题就变神题了!
-
题意不太清楚和队友确认题意
-
自己没有太多想法和队友一起讨论,不要一个人自闭的想太久!
写题前必须经历的步骤
6. 再次确认题意,模拟样例!
-
自己确认做法,认真静下来想,一定不能觉得自己显然是对的或者可能是对的就开始写。必要时找队友确认(只要不是一眼签到都应该和队友确认)
-
理清楚代码中的细节,程序实现流程,模块,边界条件,如果是推式子的题再推一遍式子,并想想边界情况和分类讨论的情况
-
如果需要抄模板,先熟悉看懂模板再抄
-
写完代码先自己通读一遍。再gdb调试和提交
-
看清需不需要加文件
调题顺序
12. 先检查数组大小
-
检查是否正确清空数组
-
检查输入输出格式,n和m是否读反等
-
看题目边界数据点是否考虑到
-
静心阅读自己的代码,想想每个细节是否写对,不要盲目相信自己的代码一定是对的。要边读边思考,任何地方都可能出错
-
可以对拍,并且不太麻烦立即对拍。
-
和队友确认算法,寻求队友帮助,在自己束手无策的时候一定不要坚持自己调。这时一定要找队友的帮助。
-
两个队友调不出来,找第三个队友
-
先放下来,等开出其他题,冷静一下再调
杂事杂项
-
最后几分钟写题的时候不要因为压力大就放弃思考开始无谓地gdb,没啥意义。
-
关键细节想清楚之后再上去写题。
-
多项式乘法在数据范围较小的时候可以暴力算以提高精度。FFT做完乘法之后的那个数组里的虚部记得清。
-
第一发不要交任何含有assert的代码,调不出来开始爆OJ了再交。
比赛前准备
- 测试栈大小
- 测试评测机速度 排序,取模运算
- 测试评测机是否开O2
- 测试评测机是否支持int128,float128
- 查看编译选项中是否有python和java
- 看所有训练的trac,回忆每场比赛流程,思考犯的错误
- 看所有注意事项
- 比赛开始前静心思考比赛注意事项。