防错笔记
SB 错误
多测要清空!
多测要清空! 多测要清空!
开long long!
卡常时不用 ll! 开long long!
inf 不能设小!
也不能太大!
记得算内存!
估算会不会MLE! 记得算内存!
freopen!
freopen! freopen!
交前删调试!
交前删调试! 交前删调试!
开数组空间要开够
估算会不会MLE
链式前向星 idx 初值为 0 或 1 写法不同
初值为 1
1 |
|
初值为 0
1 |
|
或者
1 |
|
并将 h
数组初始化为 -1
要看清楚题目的输入输出
写代码的时候不能忘记读取数据或输出答案。
循环的边界要注意
1 | void primeseive(int n){ |
第 2
行中的 i=2
如果写成 i=0
,
将会导致死循环。
二维数组边界特判, 大于取等于, 小于就不能取等于, 以保证不漏取不多取:
1 | ... |
动态规划想清楚状态表示, 并相应初始化
要注意代码的逻辑顺序
区间合并
1 | int merge(){ |
1 | if (l != -2e9) tmp.push_back({l,r}); |
两行不能调换位置,否则会把第一个区间加入答案中,导致一些情况中结果多了一个。
不过在区间合并中只要区间个数不为零,最后个数一定会加一,所以这意味着我们在调换这两行的位置后,再将最后的
if(l != -2e9) tmp.push_back({l,r})
删去,,最终结果也是正确的,不过 tmp
中的区间具体情况就不对了。
字符串
字符串类型转化
字符(char
)转整型(int
)要记得减去
'0'
。
C++ 语法
namespace 在 typedef 前
函数中需要的全局变量不可在main
函数中重新定义
慎用宏定义
1 |
这个宏定义不可以传入函数, 因为这样会导致函数有几率被多算一次, 直接是复杂度增大一个量级(在递归中), 所以很可能会导致TLE.
用 %lld
而不是
%I64d
因为CCF评测机是Linux系统, long long
用
%I64d
输出会导致 WA
.
流同步关闭后不可同时使用cstdio
和iostream
ios::sync_with_stdio(false)
之后不可同时使用
scanf
printf
puts
套装 和
cin
, cout
.
注意运算符优先级
取模运算优先级高于加法
位运算优先级低于四则运算
优先级表格
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | :: |
作用域解析 | 从左到右 |
2 | a++ a-- |
后缀自增与自减 | |
_type_() _type_{} |
函数风格转型 | ||
a() |
函数调用 | ||
a[] |
下标 | ||
. -> |
成员访问 | ||
3 | ++a --a |
前缀自增与自减 | 从右到左 |
+a -a |
一元加与减 | ||
! ~ |
逻辑非和逐位非 | ||
(_type_) |
C 风格转型 | ||
*a |
间接(解引用) | ||
&a |
取址 | ||
sizeof |
取大小[注 1] | ||
co_await |
await 表达式 (C++20) | ||
new new[] |
动态内存分配 | ||
delete delete[] |
动态内存分配 | ||
4 | .* ->* |
成员指针 | 从左到右 |
5 | a*b a/b a%b |
乘法、除法与余数 | |
6 | a+b a-b |
加法与减法 | |
7 | << >> |
逐位左移与右移 | |
8 | <=> |
三路比较运算符(C++20 起) | |
9 | < <= |
分别为 < 与 ≤ 的关系运算符 | |
> >= |
分别为 > 与 ≥ 的关系运算符 | ||
10 | == != |
分别为 = 与 ≠ 的相等性运算符 | |
11 | a&b |
逐位与 | |
12 | ^ |
逐位异或(互斥或) | |
13 | | |
逐位或(可兼或) | |
14 | && |
逻辑与 | |
15 | || |
逻辑或 | |
16 | a?b:c |
三元条件[注 2] | 从右到左 |
throw |
throw 运算符 | ||
co_yield |
yield 表达式 (C++20) | ||
= |
直接赋值(C++ 类默认提供) | ||
+= -= |
以和及差复合赋值 | ||
*= /= %= |
以积、商及余数复合赋值 | ||
<<= >>= |
以逐位左移及右移复合赋值 | ||
&= ^= |= |
以逐位与、异或及或复合赋值 | ||
17 | , |
逗号 | 从左到右 |