常犯错误

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


并查集

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

邻接表

  1. 无向边不开双倍空间
  2. 使用 next 作为数组名导致 CE

线段树

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

STL

  1. 排序时把 nm 弄反。
  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>Windows 下不会报错,但 Linux 一定 CE
  2. #include <bits/stdc++.h> 中的 / 打反 (同上)
  3. 有返回值的函数不 return
  4. 开小数组
  5. 负数下标导致 RE
  6. 不开文件或文件输入输出写错
  7. 使用不关流的 cin 读入 106 级别的大数据。
  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. T1 不一定是最简单的,请先通读一遍题目之后再考虑从哪里开始
  3. 读过题目之后请简化题意,即使用形象化的语言复述一遍题意
  4. 前两小时打满暴力,后两个半小时思考正解,这样就算什么都没思考出来也不至于空手而归,而且暴力可以用于对拍
  5. 边界处理拿不准时就在纸上举个例子再写。
  6. 数据分治(注意别判错子任务)
  7. 最后 5min 不要修改程序,只去检查题目名,文件夹,文件输入输出等是否正确即可。
  8. 对拍的使用方法:点这里
  9. 程序使用内存的查看方法(以 A + B 为例子):
cpp
#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

image.png

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


祝大家 NOIP 都能取得好成绩。

THE END