卡常小技巧(不定时更新)

整理一些常见的和冷门的卡常技巧,欢迎大家评论补充。

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致命一击(话说卡空间到底能不能算卡常)

猜你喜欢

转载自www.cnblogs.com/AppleC/p/11730170.html