- 开辟的数组空间稍大于理论值 -> 更加保险
- 声明数组大小(以理论范围为 100000 为例)
const int N = 1e5 + 10;
- 取中间位置时,取中间位置用如下写法 -> 避免造成整数结果溢出
l + ( r - l ) / 2
- 浮点数精度最好比要求的多两位 -> 更加保险
r - l > 1e-8 // 要求:结果保留 6 位小数。
- 工程中空间能省一点儿是一点儿,算法中重要的是效率和通过率
- 工程中药考虑内存,算法中不要考虑内存泄漏的问题,否则会绕进去,能 ac 就行
- 使用如下方法,让 cin,cout 的效率和 scanf,printf 差不多
std::ios::sync_with_stdio(false);
std::cin.tie(0);
- 这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。
cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几.- tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。- 注意点:使用之后,不能够混用 cout 和 printf,cin 和 scanf。
- ACM中常用的无穷大常量——0x3f3f3f3f
const int inf = 0x3f3f3f3f;
0x3f3f3f3f的十进制是1061109567,是10 ^ 9级别的,而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
0x3f3f3f3f是一个很有用的数值,它是满足以下两个条件的最大整数。
1、整数的两倍不超过 0x7f7f7f7f,即int能表示的最大正整数。
2、整数的每8位(每个字节)都是相同的。
我们在程序设计中经常需要使用 memset(a, val, sizeof a) 初始化一个数组a,该语句把数值 val(0x00~0xFF)填充到数组a 的每个字节上,所以用memset只能赋值出“每8位都相同”的 int。
当需要把一个数组中的数值初始化成正无穷时,为了避免加法算术上溢出或者繁琐的判断,我们经常用 memset(a, 0x3f, sizeof(a)) 给数组赋 0x3f3f3f3f的值来代替。
- memset 是以字节为单位复制的,不能用于普通数组的初始化,一般用于char 或者 0 和 -1 的初始化。
memset(h, -1, sizeof h); // memset 按字节复制 -1 为 0XFF,复制后为0xFFFFFFFF也为-1
memset(h, 0, sizeof h);
- 输入特别多,如果超过1e6 之后才必须用 scanf,否则和 cin 效率差不多。
- 为什么当输入数量级是 1e5 时至少要用 O(nlog(n)),如何评估会不会超时。
- 整数除法向上取整方式及证明:
result = (m + k-1) / k;
- 解决 LeetCode 中加速 cin、cout 的方法,使用静态 lambda 函数;
static int _ = [](){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}();
- 可以接受的算法时间复杂度估算表
- 本地读测试用例的宏,避免手动输入测试用例
#ifndef ONLINE_JUDGE
freopen("in1.txt", "r", stdin);
#endif