SCP 我们读题,思考,摆烂(CSP 注意事项)
有好多是复制的
注意事项
考试风貌
当你来到考场:
上机测试时多敲敲键盘,顺手的键盘都需要敲打一番~(提前熟悉键盘的各个键——经常会与自己学校的不一样)
根据个人需求并在合理时间内待在考场里,熟悉一下气氛。
别理别人。
自始而终别对拿大奖有太大执念,得之我幸失之我命。 执念过深反而是负担。
做个素质人,坚守职业操守,和生活美德。分可以丢,但做人最基本的原则不能没有。是啥应该不用我说(玩烂梗)。
考试ing:
检查文件的扩展名是否显示,若不显示,一定要将扩展名显示出来。
无视旁人,做丫的题。
思考时间超过 \(\text{0.5~1h}\) 就放松一下,一直不停脑袋会乱的。
无论附近的人键盘敲多大声,你都不要管他,实在不行心中默念:“不是我的(指键盘)不是我的不是我的不是我的...”当然不想忍记得举报
好好读题
咱举个例子,你们仔细观察下面这段描述:
具体我不说了,你品,你细品~
拼了你的老命去卡你的代码!
这题你会,不要发出愉悦♂的声音,不会,也不要发出愉悦的♂声音。不要影响其他人
离开时垃圾带走,别落下什么东西。(之前我把饭卡落下了,结果人家托人送回来了,感动 \(\text{QWQ}\))
考完了:
别 fake。
其他
代码
注意 \(\text{C++14}\) 的编译环境,\(\text{vector double}\) 等的新用法或改变
如果有非常奥妙的操作,啥数据结构都维护不了,那试试分块吧。
调试
可以定义标识符来进行本地调试
#define FUCK
#ifdef FUCK
//do something interesting
#endif
// or
#ifndef FUCK
//do something interesting
#endif
#ifdef
会检查程序中是否有通过 #define
定义的对应标识符,如果有定义,就会执行下面的内容,#ifndef
相反,在没有定义相应标识符的情况下执行后面的语句。
我们提交程序的时候,只需要将 #define FUCK
一行注释掉即可。
对拍
写了份代码,但是不知道它对不对。
如果时间足够,写对拍。
原料:一份暴力(或其他非正解),一份你写的薛定谔的正解,一份数据生成器
当然,我们不能自己比对两段程序的输出,所以我们需要通过批处理的方法来实现对拍的自动化,要不然太慢了。
每次运行一次数据生成器,将生成的随机数据写入输入文件,通过重定向的方法使两个程序读入数据,并将输出写入指定文件,利用 \(\text{Windows}\) 下的 fc
命令比对文件(\(\text{Linux}\) 下为 diff
命令)(\(\text{YLCH}\) 讲过),从而检验程序的正确性。
如果发现程序出错,可以直接利用刚刚生成的数据进行调试
模板
#include <bits/stdc++.h>
using namespace std;
signed main () {
//For Windows
while (1) {
system("gen > test.in");//数据生成器将生成数据写入输入文件
system("test1.exe < test.in > a.out"); //获取程序1输出
system("test2.exe < test.in > b.out"); //获取程序2输出
if(system("fc a.out b.out")) {
//该行语句比对输入输出
//fc返回0时表示输出一致,否则表示有不同处
system ("pause"); //方便查看不同处
return 0;
//该输入数据已经存放在test.in文件中,可以直接利用进行调试
}
}
}
关于随机数据生成
- 在使用
rand()
前,别忘了调用srand(time(NULL))
来重置随机数种子。(不重置的话,每次调用rand()
只会得到一套随机数) rand()
的生成随机数范围在 \(\text{Windows}\) 下为 \(\text{[0,32767]}\) ,在 \(\text{Linux}\) 下为 \([0,2^{31}-1]\),所以如果数据过大,最好手写一个随机数生成器。
防爆
常按 \(\text{Ctrl + S}\) 是个不错的习惯。
空间允许的情况下,记得开 \(\text{long long}\),但不要动不动就 #define int long long
看好空间。
有了更好的思路?当前代码不要删,注释掉或重开一个文件,说不定以后会用。
最后几分钟,查看 \(\text{freopen}\),编译运行一遍。
凡是位运算全部加 () !!!/fn
慎重使用短路评估,位运算等价宏
宏 | 定义为 |
---|---|
and | && |
and_eq | &= |
bitand | & |
bitor | | |
compl | ~ |
not | ! |
not_eq | != |
or | || |
or_eq | |= |
xor | ^ |
xor_eq | ^= |
输入输出量大的记得写快读快出
template <typename T>
inline void read (T &a) {
T x = 0, f = 1;
char ch = getchar ();
while (! isdigit (ch)) {
(ch == '-') and (f = 0);
ch = getchar ();
}
while (isdigit (ch)) {
x = (x << 1) + (x << 3) + (ch ^ '0');
ch = getchar ();
}
a = f ? x : -x;
}
template <typename T, typename ...A>
inline void read (T &t, A &...a) {
read (t), read (a...);
}
template <typename T>
inline void print (T x) {
if (x < 0) putchar ('-'), x = -x;
if (x > 9) print (x / 10);
putchar (x % 10 + '0');
}
signed main () {
int a, b, c;
read (a, b, c);
}
实测自己写 \(\text{inline int abs/max/min}\) 要比 \(\text{C++}\) 自带的快一丢丢
递归函数不要加 \(\text{inline}\),逆优化。
最后祝各位
\(\Huge{\text{CSP RP++}}\)