日常细节Bug合集
开坑有亿点点晚、
首先开 -Wall
,可以一定程度上避免许多问题
-
数组空间一定要开够,只要在限制内就随便开,宁可开大,最好宏定义避免改漏
-
数据范围不确定就全局 \(long long\)
-
想清楚状压/哈希时 \(0\) 是否产生“不存在”与存在第一项的冲突,想清楚边界的意义,考虑是否需要取到 \(-1\)
-
最大值/最小值不要太小或太大,小心爆 \(int\) / \(long long\)
-
注意检查相似字符(如 \(l,i\) 和 \(1\),\(u\) 和 \(v\),\(p\) 和 \(q\) 等),或者码代码时相应慢一点
-
运算符优先级:
小括号()
\(>\) 逻辑非!
\(>\) 乘、除、取模 \(>\) 加减 \(>\) 位移>>
、<<
\(>\) 按位与&
\(>\) 按位异或^
\(>\) 按位或|
\(>\) 逻辑与&&
\(>\) 逻辑或||
\(>\) 三目运算符 \(>\) 赋值=
建议疯狂加括号,三目运算的表达式一定要加 -
函数的参数列表调用顺序与数组的寻址顺序永远是个谜,尽量不要调用 \(read()\) 或嵌套自增/自减
-
另外用大括号对应赋值的时候搞清楚对应的位置
-
文件操作一定要检查
-
考虑线段树 \(pushup\) 时左右区间是否有先后/依赖关系
-
考虑各种数据结构涉及 \(pushup\) 时需要的信息是否已经在建树前处理完
-
值域树查找时注意区间和个数是 \(k\) 还是 \(cnt\)
-
网络流 \(bfs\) 跑完再返回,否则每次清空队列复杂度可能更劣
-
哈希想清楚往哪边对齐
-
\(Base\) 尽量取数值足够大并且 \(popcount\) 较大的数,被卡的概率会相对较小
-
但凡哈希一定有 \(Base^{k}\) 作为基数,否则大概率冲突
-
图上遍历死循环时检查先建边与遍历的 \(for\) 循环,其次考虑 \(vis\)
-
转移时记清楚哪一维维护什么信息,写之前统一写法
-
考虑清楚建图的存边与各种生成树的存边能不能通过 \(tag\) 实现数组共用,不要怕浪费空间
-
容斥考虑是否需要一直归纳还是只有有限层
-
#\(define\) 里加括号!!会直接替换内容,不保险就用 \(typedef\) 和 \(using-as\)
-
\(LCA\) 的倍增和其他倍增混用时注意** \(0\) 代表的边界**不一样
-
初值不一定都无关紧要,尤其针对倍增数组
-
大部分平时做题死活调不出的情况终结于面向数据编程,考虑手模数据
-
\(\dots\)
然后就是会思路不会实现或者懒得想的问题了
附完整运算符优先级:
-
括号运算符:圆括号
()
,方括号[]
,花括号{}
-
成员访问运算符:点
.
和箭头->
-
单目运算符:
*
(解引用),&
(取地址),++
,--
,+
,-
,~
,!
,sizeof
-
类型转换运算符:
static_cast
,dynamic_cast
,const_cast
,reinterpret_cast
-
乘法/除法:
*
,/
,%
-
加法/减法:
+
,-
-
位移运算符:
<<
,>>
-
关系运算符:
<
,>
,<=
,>=
-
相等运算符:
==
,!=
-
位运算符:
&
,^
,|
-
逻辑运算符:
&&
,||
-
三目运算符:
? :
-
赋值运算符:
=
,+=
,-=
,*=
,/=
,%=
,>>=
,<<=
,&=
,^=
,|=
-
逗号运算符:
,