long long相关
1,没开long long /long long开少了。
具体地,可能是未对题目可能产生的数值预估,可能是只写了int的读优,忽略long long。
2.#define int long long出锅。
-1,比如在遍历图的时候,vector的返回值会出现问题,要强行转换(ll)。
-2,main函数类型设置成signed ,避免出现long long main。
3.爆long long 。
毒瘤出题人,要用unsigned long long。。。
double相关
1.double爆精度:
-1,对于小数点后面的精度要求,要记得给eps,至于具体的值。。。看缘分。
-2,对于表示大数并且要用大数比较,double会自动丢失精度,强制转化回long long的时候要手动四舍五入,即手动(+0.5)(long long)。
-3,double的a*=b比a=a*b更容易爆精度(在大数比较的时候有过惨痛教训)。
-4,类似前几次考试的套路,需要用大数比较的时候,一般可以转化为判断是否超过inf之类的分类讨论,即达到一定大小后不需要继续增大,所以不要一来就用double/long double,想一下能不能简化。
2.double与long double 的输出:
double:%lf ,long double:%Lf .
数组相关
1.位移少打一个"<",比如:
a
[
N
<
<
1
]
−
>
a
[
N
<
1
]
a[N<<1]->a[N<1]
a[N<<1]−>a[N<1]。
2.n,m不同阶,有常数大小的区别,然后往小的开,挂掉。
3.双向边少算,特别是在网络流的一些复杂建图中。
4.倍增数组的两维写反。
5.注意一点,vector的size()函数返回值为unsigned int,size()==0时,如果直接用size()-1判断一些边界并不会返回-1,但是如果保存为int类型时会转化成-1,所以vector存边的时候可以放心大胆的从size()-1遍历到0;
6.WOJ一些题卡ST表,因为本身st表开的下,但是剩余的空间不多,而WOJ需要网站开栈,加起来直接爆空间,运行时会RE。
7.长链剖分的指针写法一定要把空间开正确,正反走要弄清楚,否则蜜汁RE,WA。
lower_bound相关
1.对支持随机访问的STL容器(如vector)可以用普通的lower_bound()函数套,比如:lower_bound(vector a.begin(),vector a.end(),x),复杂度依然是单词O(log),但是对于set这样不支持随机访问,一定要自带的lower_bound,不能用l普通的lower_bound()套。
比如:
set s.lower_bound(a):
O
(
l
o
g
n
)
O(logn)
O(logn)
lower_bound(set s.begin(),set s.end(),x):
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
2.lower_bound()范围内的 数组必须严格单增,范围不能给大,否则可能出现最后一个为0,然后出错。
初始化相关
1.在函数里面(包括main函数和自己定义的其他函数)申明的变量一定要初始化。在全局定义的不需要。
2.注意那些值本身就为0的点。比如:如果dep从0开始编号,且树上加的是双向边,就不能用
(
d
e
p
[
v
]
≠
0
)
(dep[v]\neq0)
(dep[v]=0)来防止重复走点。否则虽不会死循环,但是处理出来的dep数组大小有误,后面可能会出现一些奇怪的错误。
3.全局的定义才是初始化为0。注意static相当于在全局定义了一个变量,每次进入函数不会重置,可能要手动重置。
各种写错,少写
1,返回值为int的函数,忘记写返回值类型,在本地编译可以过,然后CE。。
2,忘关文件名(是输出文件名),我说怎么老是WA来着。
3,文件名打错。不是我英语不好,island我会拼,但是出题人用大写的i充当小写的l。。这时候复制粘贴最保险。
4,在一些最没有存在感的地方写错变量名,调试时间+=inf。比如:把前向星的指针名写错。。
5,namespace里面定义了与全局同名的变量,然后在全局主程序读入了,在namespace的main里面忘记删除这个定义,于是WA。(比如说分段的n,m。但是这个试一试样例就出来了,除非没时间试样例了)
6,把关键模板写错。比如把lct中的splay的rotate写错,调试时间+=inf。
自己YY出错
1.unique()函数的实现方式会改变原序列中重复的数,所以不是简单的把前面重复的丢到后面,不要妄想对unique()之后的总数组求num的cnt之类的,unique完后,之后范围内的能用。(unique可以处理先增后减的去重)。
2.对于一些特殊情况或者边界情况,没有看清楚题意或者没有仔细想就想当然地加一些错误地剪枝特判,然后WA愉快。
3.把离散化后的数组和原排好序的数组傻傻分不清,调试时间+=inf。
4.图论题,未考虑图不连通,没有写for循环dfs。
5.inf开小。特别是一些需要double存大数的dp题。要注意不同的实现方法对inf的大小要求可能不一样。最后发现inf需要开到
1
e
399
1e399
1e399…长姿势了。。以后尽管往大了开inf。(不能加爆)
6.写了取模模板,但是忽略了一开始就是负数的情况。
Conclusion
以上错误,多半都是没想清楚就写代码的结果。
想清楚所有过程再写,写的时候不要浮躁。
比如:码量题拿着一个错误的算法写了一个小时,然后突然把自己叉掉。。。拿着一个错误的贪心标准质疑数据,拿着一个假掉复杂度的算法质疑评测机等等.。。。
PS
当然,出题人拿着错误的标程面向程序出数据的情况偶尔还是有的。