赛前提示
By ProtectEMmm;2024-10-15。
编译相关
- 不要包含头文件
<Windows.h>
。 struct
最后没加分号。set,map,priority_queue
套结构体但是没有重载小于号。int mian()
。- 使用了一个没声明的变量。
- 括号没匹配。
- 结构体不要用默认初始化,而是使用构造函数去初始化。
- Windows 下把万能头打成了
<bits\stdc++.h>
,但能过编。
文件读写相关
- 没写文件读写。
- 文件名写错了。
- 没有清空缓冲区然后
fclose
了,导致没有输出。 - 文件名后面不要加空格,会爆零。
- 有人把输入输出写在了
freopen
前。
读入输出相关
cerr
没删虽然没WA
但是导致TLE
。- 没关闭同步流,使用
cin,cout
导致TLE
。 - 关闭同步流后,
cin,cout
与scanf,printf
不能混用。 - 关闭同步流后,没有
endl
清空缓冲区然后fclose
了,导致没有输出。 - 关闭同步流后,没有
#define endl '\n'
导致反复清空缓冲区最后TLE
。 mmap
快读在linux
环境下编译可能存在一些问题,但主流 oj 都测不出来这个问题。scanf
没有加&
,读字符串的时候加入了&
。printf
输出double
的时候用%f
而不是%lf
。- 如果只会
getchar()
快读,那就老老实实用关流后的<iostream>
。
命名相关
- 使用了
y1
这个变量名然后暴毙。 y0,y1,yn,j0,j1,jn
都不能当变量名使用。tm
不能当变量名。- 使用
next,time,case,array
等单词作为变量名。 - 没有发现自己相同的变量名在全局和局部都开了一次。
写顺手了
- 写顺手了
for(int i=1;i<=n;++i)for(int j=1;j<=n;++i)
。 - 写顺手了
for(int i=n;i>=1;++i)
。 - 题目先读入
m,n
,但是写顺手了cin>>n>>m;
。 - 写了
if (...);
后顺手加了个分号。
#define int long long
相关
- 使用了
#define int long long
导致TLE
或者MLE
或者RE
。 - 使用了
#define int long long
后没有改为signed main()
。 - 使用了
#define int long long
后scanf
用的还是%d
。 - 不要使用
#define int long long
。
习惯不好相关
if
里赋值号和等于号不分。- 一个局部变量没初始化就使用。
- 不开
long long
见祖宗。 - 运算符优先级记不清还不打括号
1<<2+1
。 - 多测没有清空。
- 使用 STL 容器没有先判空就
pop
或者top
。 - 发生了数组越界导致
RE
,甚至他的下标是负数! - 禁止把大数组开在局部里。
- 调式信息没删干净。
- 没有想清楚下标从
0
开始还是从1
开始。 - 一个函数至少要有一个紧挨着右括号的
return
。 - linux 系统下,
main
函数没有return 0
导致RE
。(存疑,现在似乎不会出问题了,但最好都加上)。 - 递归没写递归边界导致死循环。
- 背包问题正序倒序枚举搞混了。
double(int/int)
算出来还是个整数。- 把题给读错了,等发现的时候已经晚了。
- 没注意题目要求
double
保留几位小数。 - 写高精乘法,下标不从 0 开始非要从 1 开始。
- 不要卡着内存上限开数组,你的代码中会有其他的内存开销。
- 多测不要用
memset
清空数组。 - 老老实实把数据读入完再干别的事情,不然有可能发生玄学情况。
- 记得取模。
- 不要用
register
。 #define N 100000+5
(后面有int a[N*2]
)。- 结构体内直接赋值,开数组后容易编译超时或编译文件过大。
- 数组使用
{}
初始化,容易编译超时或编译文件过大。
坑点提示
- 求
lcm
要先除再乘,不然可能炸精度。 - 使用
&&,||
有可能触发短路运算,如果把赋值放里面就会被短路掉。 - 禁止使用
gets
。 - 判断一个数的奇偶不要用
if(x%2==1)
,因为x
有可能是负数,模完是 \(-1\)。 - 用位运算判断偶数不要写
if(x&1==0)
,因为会先算1==0
。 memset
使用了0X7F
后进行了加法运算导致溢出。- \(2\) 的 \(60\) 次方是
1ll << 60
,不是1<<60
。 mid=(l+r)/2
是错误的。getchar
有可能会读入换行符。sqrt
在long long
范围内有可能产生精度误差。- 注意题目的
YES
还是Yes
还是yes
还是YE5
。 - 注意
abs
和fabs
的区别。 - 我有一次总是莫名其妙的
WA
,直到我发现我把O
打成了0
,所以同理还有I
和l
和1
。 - 对拍不要开满栈,DFS 有可能陷入死循环把计算机资源占满导致死机。
- dev 会头文件补全,有人蓝桥杯写
bits/stdc++.h.
编译通过了,但是爆零。 .size()
是 unsigned 类型,和-1
比较的时候会变成无限大。
STL相关坑点
- 开了一堆
deque
导致原地MLE+TLE
。 queue,stack
默认底层容器也是deque
,所以也会导致MLE+TLE
。- 使用
map
的时候,下标元素会自动insert
进平衡树里,导致最后的size
不一定是有效元素的个数。 - 没有使用
set.lower_bound
而是lower_bound(set.begin(),set.end())
导致TLE
。 - 使用
multiset
然后erase
了一个值导致全被删了。 - 以为
priority_queue
是小根堆。 - 使用
STL
容器删除插入导致迭代器失效。 size()
是一个无符号类型的返回值,有可能会导致CE
,另外强转前别拿这个做减法。
线段树相关
- 线段树开 \(4\) 倍空间。
lazy
标记没有清空。maintain
后没有pushup
。- 忘了
pushdown
。 mid=(l+r)/2
是错误的。- 查询修改之类的,注意判一下
l>r
的情况。
赛场上一些神秘的事情
- 使用命令行时,编译命令打成了
g++ x.cpp -o x.cpp
,把代码给覆盖了。 - 我那年 NOI 出了一个事情,有人比赛结束了,但是代码没有关,然后不小心压到了键盘,并且自动保存了。
- 管好你的脚,别闲的没事踢点东西。
- 水撒键盘上了,所以应该把水放地上。
- 没有保存代码,但是电脑断电了。
- 不要携带手机,手表等设备,放包里也不行(IOI 2024 惨案)。
- 禁止赛后使用 U 盘拷贝代码。
- 没有按照要求建立目录和命名。
题目中的一些 corner
- 除
0
模0
。遇到相关题目一定要思考一下有没有这种可能性。 - 没有特判 \(n=0\),\(n=1\) 之类的 corner 数据。
- 有关质数的题没考虑到 \(2\) 是唯一的一个偶数质数。
- 有关图的题,题目到底有没有说清楚有没有自环和重边。
心态相关
赛前
- 不用紧张不用害怕。
- 你的训练是不会背叛你的。
- 不要把比赛看的太重。
- 你的对手都是一群乌合之众。
赛中
- 你进入考场会看到一个文件夹,非常诱人,你很想点开他。但你先别点开他,你先复制备份一份。防止你把题目数据破坏。
- 题难,大家都难。
- 题简单,你失误了,就完了,所以要对拍。
- 不要看一眼四个题发现都不会,心态就爆炸了。
- 不要头铁在一道题上。
- 有些同学信心不足害怕失败,故意赛场上当铁头娃,这样为自己没拿到预期奖项创造理由。
- 暴力打满就是省一。
- 一道题怎么都没思路,你先确定一下是不是题读错了,或者看漏条件了。
- 如果代码怎么都调不出来,那就删了重写一遍。
- 比赛结束前 10 分钟,不要继续写代码了。别信自己能绝境反杀。你更应该检查一下你的文件读写,再编译一遍,测试一下确保能过大样例。
赛后
- 考好了可以开心可以庆祝但不要飘,人外有人天外有天,甚至未来的自己都会嘲笑现在的自己。
- 要承认天赋是存在的。
- 一般人的努力还达不到被天赋限制住的程度。
- 你努力了,别人也在努力。
- 不用羡慕别人。
- 机会总会有,但你得把握住。
- 我高中老师说过的一句话,现在送给同学们:“别人考好了说自己只是运气好,你们就真的以为是人家运气好,其实是别人会,考试正好出了,别人拿到了分,你们一个个还真以为别人是因为运气才考得好”。
- 一次比赛说明不了什么,你的未来也不会被一次比赛限制住。