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