转自:http://blog.csdn.net/qq_33583069/article/details/53086992
如果编译器没有开O2优化
用库函数常数会凭空增加很多。。
似乎NOIP考场不开O2
某些时候,如果你优化到无法再优化的时候
尝试去自己重新实现库函数。
比如
- isdigit()
- max()/min()
- unique()/lower_bound()/upper_bound()
- scanf()/printf()
- cin/cout
- getchar()/putchar()
- STL::queue/stack/priority_queue/deque
- …
常数优化:
位运算
没有O2的时候(有O2不用管。编译器会帮你)
x*10 <=> (x<<3)+(x<<1)
x!=y <=> x^y
x!=-1 <=> ~x
x*2 <=> x<<1
x*2+1 <=> x<<1|1
x/2 <=> x>>1
(x+1)%2 <=> x^1
x%2 <=> x&1
x%2==0 <=> ~(x&1)
语法
inline 在非递归函数前加修饰。
循环变量 int i =>register int i
c++没有尾递归优化。所以可以自己手写栈来优化递归。
原则上尽量减少乘/除/取模 指令
取模指令如果是逐渐累加的话,
x+=add;x%=mod;
=> x+=add;x>=mod?x%=mod:1;
A?B:C 好像要比if,else语句快。
memset初始化细节 memset(a,0x3f,sizeof(a));
最后的a[1] = 0x3f3f3f3f
int的极限是 0x7fffffff
还可以~0u
INF有的时候不要刚好赋值到0X7FFFFFFF,如果有2个inf的值相加就会溢出。
乘法溢出。
这个要注意。不要直接全部long long这样慢很多
关于类型转换,一般不用管,编译器会处理。
但是,考试环境有点老?没试过,所以如果有不同类型的话最好在前面显示的强转一下。
赋值>int的话请在数字后加LL