整理一些常见的和冷门的卡常技巧,欢迎大家评论补充。
1.定义常量const int
给定mod用const int,mod用的多的话时间至少减半(有一次比赛题目TLE了,考完加了const从3.1s->1.2s)
2.寄存器register的使用
一般用在循环中用register int,不要滥用,不然可能会出现玄学错误!
register int 亲测在for循环中时间为直接int的1/5,减少了4/5!
3.函数化
inline int add(int a,int b) {return a+b>mod?a+b-mod:a+b;}
inline int sub(int a,int b) {return a-b>=0?a-b:a-b+mod;}
inline int mul(int a,int b) {return 1ll*a*b%mod;}
比直接(a+b)%mod,(a-b)%mod要快一点,至于mul是为了好看防止忘记加1ll。
inline 一般用于比较短的,使用频率高的函数,它快的原因是把函数封装起来了,
缺点是调试时不能看到内部(网上看见的,自己调试的时候似乎没什么问题).
inline 是对编译器的一个建议,不是命令,所以对于实现过程复杂的函数(如递归,需要传递参数)
编译器不会采取建议,inline是无效的。
4.位运算
比如x<<=1代替x*=2啊,x&1代替x%2之类的就不多说了,灵活运用就行。
一般能用位运算优化的地方在程序中调用的次数不是很多,所以效果不太明显。
现知可以大量位运算优化的地方: for循环中 i++ 可以改成 i=-~i .
把位运算渗透到生活代码当中!
5.变量类型的选择
long long类型比int类型计算慢很多,
不过除非万不得已还是不要卡这个常了(不开longlong见祖宗)
如果数据范围小你甚至还可以用short
还有,听说int 比bool 快一些,不过是不是可以换成short
6.map查找小技巧
map查找某个元素的时候,先用mp.count(x)判断是否存在这个元素,再询问mp[x],
因为map在调用mp[x]时,如果不存在mp[x],会自动创建一个值为0的映射。
想想查询的时候平白无故添加了一个元素,不说时间长了不少,空间可能一不小心就炸了,
MLE致命一击(话说卡空间到底能不能算卡常)