算法竞赛通用技巧
1.INF
1 |
|
INF这个常量表示最大值
通常令INF = 0x3f3f3f3f
相比于INT_MAX,这个值有3个好处:
- 0x3f3f3f3f的十进制是1061109567,也就是109级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于109的,所以它==可以作为无穷大使用而不致出现数据大于无穷大的情形。==
- 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还==满足了我们“无穷大加无穷大还是无穷大”的需求==。
- 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以==要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))==。
2.LL/ULL
1 |
|
3.debug函数
1 |
|
4.cin/cout加速
1 |
|
cin cout 和 scanf printf:
==做题的时候尽量使用scanf printf==,因为cin cout 比 scanf printf慢20倍左右!
一旦遇到大数据量,光是读入就有可能跪掉。
可以使用std::ios::sync_with_stdio(false)这条语句关掉scanf 和cin 的同步加快效率。
但==cin 仍然慢 5倍左右==,而且一旦使用了这条语句,scanf和cin 混用可能就会造成一些奇怪的问题。
算法竞赛通用技巧
https://czwcugb.github.io/算法/未分类/OI通用技巧/