算法竞赛通用技巧

1.INF

1
2
3
#define INF 0x3f3f3f3f
//或者
const int INF = 0x3f3f3f3f;

INF这个常量表示最大值

通常令INF = 0x3f3f3f3f

相比于INT_MAX,这个值有3个好处:

  1. 0x3f3f3f3f的十进制是1061109567,也就是109级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于109的,所以它==可以作为无穷大使用而不致出现数据大于无穷大的情形。==
  2. 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还==满足了我们“无穷大加无穷大还是无穷大”的需求==。
  3. 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以==要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))==。

2.LL/ULL

1
2
3
4
5
#define ll long long
#define ull unsigned long long
//或者
typedef long long ll;
typedef unsigned long long ull;

3.debug函数

1
#define debug(a) cout<<#a<<" == "<<a<<endl;

4.cin/cout加速

1
2
3
4
5
6
ios::sync_with_stdio(false)
//这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。
cin.tie(0),cout.tie(0);
//解除cin与cout的绑定
cout<<'\n';
//效率比cout<<endl更高

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通用技巧/
作者
ChenZhiwei
发布于
2025年1月13日
许可协议