-
考虑数据范围不能只看输入的范围和结果的范围,计算过程中的范围也一定要考虑,比如输入n个1e9,但是现在需要求前缀和,那么多个1e9相加一定会爆int,所以就要开long long。
-
__int64,long long,int型之间的相加不能直接进行,只能同种类型相加。
比如__int64 j和int i。i是不能和j进行加和操作的! -
除了返回值是void型的函数以外,其他所有的函数都需要明确写出返回值是什么,如果出现函数返回值不为void但是没有写任何return的情况的话会TLE!
-
写两层及以上for循环时,一定要检查是否把内层循环写成 i ++了。
-
当函数调用的参数为结构体类型时,确定是否将结构体里需要初始化的值都初始化了,比如步数是否初始化为0。
-
计算某个数乘法或者次幂的时候,要注意数据有可能在运算的过程中就已经爆精度了,所以需要在一开始就将这个数的精度定义大一点。
- 例如:要计算i * i * i (0 ≤ i ≤ 10000)的值时候,需要在for循环中就将i定义为long long, for(long long i = 0; i <= 10000; i ++) ;
-
闰年的判断条件:if((year% 4 == 0 && year % 100) || year % 400 == 0) 是闰年。
前一种可以用2004来记(普通年份可以被4整除且不能被100整除),后一种可以用2000来记(世纪年份可以被400整除的才是闰年)。
-
在处理两个日期之间有多少天的问题,可以先预处理每年有多少天,记录前缀和,然后再单独处理月和日。
-
写 for 循环的时候,记得让
i
从1
开始,习惯写 ++i
。 -
short的范围为
-2^15 ~ 2^15-1
, int 的范围为-2^31 ~ 2^31-1
, long long的范围为-2^63 ~ 2^63-1
, __int128的范围为-2^127 ~ 2^127-1
。需要注意的是,无符号数取不到负数,如unsigned long long 的范围为0 ~ 2^64 - 1
。 -
若要使用 map<node, int> 的时候需要先将结构体里的数据进行重载,谁大谁小无所谓。
-
建图时使用链式前向星别忘了将h数组初始化为-1 。
-
对于无向图,一定要记得将与边有关的数组大小都开成边上限的2倍!!!
-
lower_bound和upper_bound只能对上升序列使用,如果要想找到一个降序序列中,第一个小于a[i]的的值的话,需要把比较器改成 “ > ” “>” “>”,即lower_bound(a + 1, a + 1 + n, num, greater< int >());
-
vector的头插复杂度很高,尽量不要用,需要的话可以使用deque,头插操作为push_front, 尾插操作为push_back。
-
STL list的用法,链表很好使点这里
-
map的复杂度稳定O(logn),而unordered_map的复杂度在最坏情况下会被卡成O(n),所以能用map就不要用unordered_map!!!—— 详细说明(转)
-
如果想要求 n ! / x ( x ≤ n ) n!/x(x \leq n) n!/x(x≤n)的话,不能先求出 n ! n! n!再除 x x x,可以在求 n ! n! n!的过程当中,不乘上 x x x,例如求 100 ! / 2 100!/2 100!/2就是从3开始累乘到100.
-
如果在输入一个整数n之后,需要输入n行字符串的话,需要在输入n之后,getline(cin, str), str = “\n”。
-
如果需要用map或者set去映射一个结构体,那么需要先在结构体内部写重载函数,需要重载每一个结构体内部的元素!
-
string的find函数如果找不到能匹配上的串,会返回string::npos,而不是0!!
-
一个数d若可以整除k个数,那么d一定是这k个数的gcd的约数。
-
如果遇到答案所求是一个序列,且需要在有多个长度相同的序列时,找到字典序最小的序列,可以用这种方法(vector):
bool cmp(vector<int> a, vector<int> b) {
for(int i = 0; i < a.size(); ++ i) {
if(a[i] != b[i]) {
return a[i] < b[i];
}
}
return a < b;
}