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文件中,可以直接利用进行调试
        }
    }
}

关于随机数据生成

  1. 在使用 rand() 前,别忘了调用 srand(time(NULL)) 来重置随机数种子。(不重置的话,每次调用 rand() 只会得到一套随机数)
  2. 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++}}\)

posted @ 2021-10-21 15:58  aleph_blanc  阅读(160)  评论(0编辑  收藏  举报