编程注意事项

注意!!!

  1. 非void类型的函数一定要打return,否则就会本地AC,交上去WA,或者交上去AC,开O2就WA。

  2. 位运算注意优先级,能打括号就打括号,!等逻辑判断运算也要和==,=等区分优先级。

  3. 深搜一般大于2×106或者一定的级别时会爆栈,注意开栈。

  4. 取模时,有减法一定要加上模数再取模,否则会成为负数,如果可能爆long long,可以用二进制位快速乘取模解决,切记能模就模。

  5. 注意看数据范围,有时需要2倍或者4倍空间,有时本身不会爆int,而累加或累乘就会爆int

  6. 数组的空间是你给它赋值或者用到它时就会占满空间,一般一个int为4B,long long和double为8B,float为4B~8B,short为2B,char和bool为1B,unsigned只是无负数。
    除了数组变量空间外,还有时要考虑程序运行所占和函数变量所占空间。而一个变量只声明未用时只占大概1B~4B左右,所以有时看似开爆空间但是过得了,而有时没开爆却因为memset等一类赋值函数导致开爆了空间。

  7. 数组溢出,不开O2的话如果你有没用的数组空间那么溢出就会到那里面,但是也可能会AC,而开了O2就会WA。还有逻辑判断,比如

#include<cstdio>
int main(){
int a=0x7fffffff-100;
long long b=10000;
for(long long i=1;i<=b;i++)a++;
printf("%d
",a>0);
return 0;
}

不开O2时会输出0,开了会输出1。
因为不开O2没有优化,他就会直接去算了后来比较,而优化时它发现a为正数,而a一直在变大,所以a肯定大于0,所以他就把a>0优化成1了,而不知a会爆掉成负数。

【8. 注意常数优化,比如快读(getchar()或者fread等),i++写成++i,使用register,inline等,使用快速模,不开O2时尽量少用STL,多用自己手写的和位运算,a=a+b尽量写成a+=b,判断奇数偶数用a&1而不用a%2。
能用一级运算就不要用二级运算。

【9.开空间时注意,除了数组之外,你的函数运行也需要一定的空间,请勿一次开到上限。【2018.6.15做NOI2017day1T1犯的错,本来52结果0分GG】

【10.结构体的初始化函数不要这样写

struct ss{
    int to,last;
    ss(int a=0,int b=0):to(a),last(b){}
}g[M<<1];   

它会一开始将所有g赋值,那么空间会特别的大。最好这样写:

struct ss{
    int to,last;
    ss(){}
    ss(int a,int b):to(a),last(b){}
}g[M<<1];

这样会节省空间和开始的赋值的时间,但是要注意局部变量不会初始化为0,小心!

原文地址:https://www.cnblogs.com/VictoryCzt/p/10053438.html