常犯错误
以下为笔者或笔者的学弟学妹曾在比赛中犯过的错误,在此列出,以供参考。
并查集
- 忘记初始化。
- 合并时不先寻找祖先,直接进行合并。
find()
函数忘记路径压缩。
邻接表
- 无向边不开双倍空间。
- 使用
next
作为数组名导致 $\text{CE}$。
线段树
- 不开四倍空间。
#define lson(x) x << 1
时,x << 1
不加括号。- 不建议在数据结构中使用
num
作为变量名,因为意义过于广泛。
STL
- 排序时把 $n$ 与 $m$ 弄反。
- 试图使用
memset
将非bool
数组赋值为 $1$。 - 在
STL
容器为空时访问其顶部或队首元素。 xxx.size()
返回的是unsigned
类型整数,尽量不要对其作减法运算- 在
multiset
中,删除一个元素为s.erase(s.find(x))
, 不是s.erase(x)
数据类型
- 数据类型不对 (不开或只有部分变量开了
long long
,double
,long double
) - 大整数相乘时不乘
1ll
导致运算时溢出 - 将
long long
类型的数据传入int
的形参。
其他
- 不加
#include <cstdio>
($\text{Windows}$ 下不会报错,但 $\text{Linux}$ 一定 $\text{CE}$) - 将
#include <bits/stdc++.h>
中的/
打反 (同上) - 有返回值的函数不
return
- 开小数组。
- 负数下标导致 $\text{RE}$
- 不开文件或文件输入输出写错
- 使用不关流的
cin
读入 $10^6$ 级别的大数据。 inf
设小 (一般int
设为0x3f3f3f3f
比较保险,long long
可以设为1e18
)。inf
设大导致溢出 (不要使用数据类型的上界作为inf
)- 二分边界达到
2e9
时mid
不开long long
- 忘记取模或取模不及时
- 多测不清空或清空不完全
- 提交前不删除调试信息。
- 使用各种不能用的变量 (
y1
,j1
等单字母变量 + 数字很容易与cmath
库冲突,end
,_end
,rank
都是Linux
保留字)。
考场策略与技巧
- 对拍模板在试机时就写完(因为一定会用到)
- $\text{T1}$ 不一定是最简单的,请先通读一遍题目之后再考虑从哪里开始
- 读过题目之后请简化题意,即使用形象化的语言复述一遍题意
- 前两小时打满暴力,后两个半小时思考正解,这样就算什么都没思考出来也不至于空手而归,而且暴力可以用于对拍
- 边界处理拿不准时就在纸上举个例子再写。
- 数据分治(注意别判错子任务)
- 最后 $5 min$ 不要修改程序,只去检查题目名,文件夹,文件输入输出等是否正确即可。
- 对拍的使用方法:点这里
- 程序使用内存的查看方法(以 A + B 为例子):
|
其运行后会产生这样一个界面
其中 bss
是所有全局变量所占用的空间之和, dec
是所有变量所占用的空间之和(单位均为字节),故 $\frac{dec}{1024 \times 1024}$ 为程序消耗的总空间(单位为 $\text{MB}$)。
祝大家 $\text{NOIP}$ 都能取得好成绩。