常犯错误

以下为笔者或笔者的学弟学妹曾在比赛中犯过的错误,在此列出,以供参考。


并查集

  1. 忘记初始化
  2. 合并时不先寻找祖先,直接进行合并。
  3. find() 函数忘记路径压缩。

邻接表

  1. 无向边不开双倍空间
  2. 使用 next 作为数组名导致 $\text{CE}$。

线段树

  1. 不开四倍空间
  2. #define lson(x) x << 1 时,x << 1 不加括号。
  3. 不建议在数据结构中使用 num 作为变量名,因为意义过于广泛。

STL

  1. 排序时把 $n$ 与 $m$ 弄反。
  2. 试图使用 memset 将非 bool 数组赋值为 $1$。
  3. STL 容器为空时访问其顶部或队首元素
  4. xxx.size() 返回的是 unsigned 类型整数,尽量不要对其作减法运算
  5. multiset 中,删除一个元素为 s.erase(s.find(x)) , 不是 s.erase(x)

数据类型

  1. 数据类型不对 (不开或只有部分变量开了 long long , double , long double
  2. 大整数相乘时不乘 1ll 导致运算时溢出
  3. long long 类型的数据传入 int 的形参。

其他

  1. 不加 #include <cstdio> ($\text{Windows}$ 下不会报错,但 $\text{Linux}$ 一定 $\text{CE}$)
  2. #include <bits/stdc++.h> 中的 / 打反 (同上)
  3. 有返回值的函数不 return
  4. 开小数组
  5. 负数下标导致 $\text{RE}$
  6. 不开文件或文件输入输出写错
  7. 使用不关流的 cin 读入 $10^6$ 级别的大数据。
  8. inf 设小 (一般 int 设为 0x3f3f3f3f 比较保险,long long 可以设为 1e18)。
  9. inf 设大导致溢出 (不要使用数据类型的上界作为 inf
  10. 二分边界达到 2e9mid 不开 long long
  11. 忘记取模或取模不及时
  12. 多测不清空或清空不完全
  13. 提交前不删除调试信息。
  14. 使用各种不能用的变量 (y1 , j1 等单字母变量 + 数字很容易与 cmath 库冲突,end , _end, rank 都是 Linux 保留字)。

考场策略与技巧

  1. 对拍模板在试机时就写完(因为一定会用到)
  2. $\text{T1}$ 不一定是最简单的,请先通读一遍题目之后再考虑从哪里开始
  3. 读过题目之后请简化题意,即使用形象化的语言复述一遍题意
  4. 前两小时打满暴力,后两个半小时思考正解,这样就算什么都没思考出来也不至于空手而归,而且暴力可以用于对拍
  5. 边界处理拿不准时就在纸上举个例子再写。
  6. 数据分治(注意别判错子任务)
  7. 最后 $5 min$ 不要修改程序,只去检查题目名,文件夹,文件输入输出等是否正确即可。
  8. 对拍的使用方法:点这里
  9. 程序使用内存的查看方法(以 A + B 为例子):
#include <cstdio>
#include <windows.h>
//windows.h 与 system 语句在提交之前务必删除或注释,否则会爆零

using namespace std;

int main() {
int a , b;
scanf("%d%d" , &a , &b);
printf("%d\n" , a + b);

system("size a.exe");
//假设文件名为 a.cpp
return 0;
}

其运行后会产生这样一个界面

image.png

其中 bss 是所有全局变量所占用的空间之和, dec 是所有变量所占用的空间之和(单位均为字节),故 $\frac{dec}{1024 \times 1024}$ 为程序消耗的总空间(单位为 $\text{MB}$)。


祝大家 $\text{NOIP}$ 都能取得好成绩。

THE END