唠嗑
因为做题训练时常常出锅,所以决定写下这篇文章,将这些错误铭记于心,永不再犯。(逃
可能不只是错误了,应该还有一些实战时的注意点和技巧(upd:2018.10.11)
错误总结
- 字符串哈希。哈希的时候尽量使用双哈希,单哈希的话尽量不要取特别常见的模数,否则被卡掉的几率会大幅度提升。(可能
良心出题人会把这些模数卡掉)。模数尽量取大一点,否则根据生日悖论,很容易出现冲突(我感觉哈希这一块我已经烂过很多次了) - 差分约束系统。如果默认每一个位置的元素大小为非负数,一定要考虑到这个限制条件,否则会出现一些奇奇怪怪的不合法解。
- 取模问题。注意取模的时候不要出现负数,同时不要忘了取模
- 精度问题。可以参见CF1059D。算法非常简单,就是一个二分+判断区间是否有交的问题。但是,需要注意以下两点:1.二分的值域要尽量大一点,一开始因为值域小然后就WA光了,并且不能二分次数太多,否则可能会T。2.实数尽量少用乘除法,这样会损失很大的精度,一开始这样写精度就真的爆炸了……
- 越界问题。主要体现在会不会爆int或long long上,这个问题在乘法的时候尤为重要。在乘法的时候注意一下边界情况,如果可能会出现越界的情况,那么就尽量转化成除法或者取一下模之类的操作,避免出现此类问题
- 对拍问题。可能有些题目暴力对于小的比较好写,大一点的就不太好写了,那么在对拍完小数据之后一定要再重新将代码认真看一遍。如果大一点的也比较好写,那么不仅要对拍小数据,同时大数据也要对拍,至少做到心中有数。不要看到拍了2~3分钟没什么问题就直接关掉,可能后面也会出现问题。
- 时间问题。尽量不要拿到一道题就直接开写,这样出错的几率很大,应该先认真思考一段时间,把这道题的细节都想清楚了再开始写,否则中途放弃比较浪费时间,且更难思考正解。
- 当你发现A不掉一道题的时候建议不要慌,反正先把自己会的部分写完然后再管剩下的部分就可以了。
- 看不清题目的话也没什么办法了。还是老老实实把整道题看一遍再说吧……
- 有些题可能因为暴力比较难以实现而无法对拍,那么这种题在写之前建议先把需要想的细节全想清楚再写,写的时候注意不要出现低级错误。
- 边界问题。考虑答案的边界情况和中间变量的边界情况,如:中间运算可能会计算到 ( 0 0 ) 0\choose0 (00),如果没有定义 0 ! = 1 0!=1 0!=1的话就会返回 0 0 0这个错误答案。再举一个例子:假设我们现在使用了迭代加深算法,答案可能为0,但是一开始的深度为1,那么答案就出现了错误。
- 有些时候可能会出现只会 O ( n 3 ) O(n^3) O(n3)的做法。如果想不出如何优化的话,那么bitset也是一个不错的选择。
建议把板子背背熟,板子都敲不对写什么题- 做数据结构题时可以考虑分块,当且仅当正规的数据结构怎么都想不出来的情况下在可以干这个事情。并且更关键地,时限比较紧的话建议多调调块大小之类的常数问题。
- 推式子的时候多注意变量的边界条件,比如说不要忽略
0
0
0之类的。对于需要NTT进行优化的题,如果发现自己的输出和样例不一样,那么可能出现两种情况:1.式子推错了 2.可以进行卷积的两个函数初始值求错了。如果说出现NTT部分写错的话,
可以回家种田了应该是很难调出来的。 - 注意空间问题,不确定空间大小就测一下……
- 题目里说下取整就不要四舍五入!!
- 可能你认为你写的代码常数较大,需要卡常。卡常时请先保存代码,以免卡常出现偏差导致改不回来了……(我觉得可能只有我这种sb才会产生这种错误……)
不要一直迷信数据很强,要相信可能能过的算法就是能A:比如说可能是3个log过 1 0 5 10^5 105之类的。- 写网络流板子不要忘了cnt=1!!!
- 看清编译环境,注意c++和c++11的情况。
- 线段树优化建图的时候注意边数是 O ( m log n ) O(m\log n) O(mlogn)级别,而不是 O ( m ) O(m) O(m)级别……
- 比赛时如果某一题可以拿到60及以上的分数,并且满分算法想了二十分钟左右并不会,可以先把分拿全了再想如何A题。(还是应该见好就收……)
- 多测不清空,爆零两行泪……
- 数组不清空,爆零两行泪……
- 注意一下最大的数据规模,开对应的数组,开大不开小!!