1. 关于编译器
- 可以使用 C++14。
- 用
-Wall 显示更多警告。
- 用
-fsanitize=address,undefined 测试 RE。搭配 -g3 使用最佳。
2. 关于终端
- 使用
ulimit -v <内存大小> 限制程序使用内存(单位:kB)。
- 使用
ulimit -s <内存大小> 限制程序栈空间(单位:kB)。
- 使用
ulimit -a 获知有哪些可以修改的项。
- 可以使用
diff 比较两个文件,传入 -Z 以忽略行末空格。
3. 关于程序
- 一定要看清文件名!一定不能打错!
- 可以在
fclose 前使用 system("grep VmPeak /proc/PPID/status >&2") 获知程序使用内存大小。
- 不要关同步流!不要搭配
cin/printf 和 cout/scanf。
- 变量名不要和 C++ 自带函数、关键字(清单见文章最后)重名!
4. 关于对拍
- 对拍流程:(设题目名为
lylakioi)
- 准备
gen.cpp(用于造数据)、std.cpp(保证正确性的代码)、和 lylakioi.cpp(需要测试的代码)。
- 编译这三份代码。(建议
gen.cpp 和 std.cpp 用 -Ofast 编译)
- 循环执行:
- 运行
./gen 获得数据 lylakioi.in。
- 运行
./std 获得答案 lylakioi.ans。
- 运行
./lylakioi 获得可能错误的答案 lylakioi.out。
- 使用
diff -Z lylakioi.out lylakioi.ans 进行比较。
- 判定是否 AC。
- 对拍代码:
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int cnt = 1;
system("g++ lylakioi.cpp -o lylakioi -std=c++14 -O2");
system("g++ std.cpp -o std -std=gnu++23 -O2");
system("g++ gen.cpp -o gen -std=gnu++23 -Ofast");
for (;; ++cnt) {
printf("testing case #%d ... ", cnt);
system("./gen >lylakioi.in");
system("./std <lylakioi.in >lylakioi.ans");
system("./lylakioi");
if (system("diff -Z lylakioi.ans lylakioi.out")) {
puts("wa");
break;
} else
puts("ac");
fflush(stdout);
}
return 0;
}
5. 关于下划线开头的函数
- 可以使用
pb_ds、rope 等。
- 可用函数清单:
__builtin_ctz(x) / __builtin_ctzll(x):返回 x 二进制表示中末尾 0 的个数。
__buitlin_clz(x) / __buitlin_clzll(x):返回 x 二进制表示中前导 0 的个数。
__builtin_popcount(x) / __builtin_popcountll(x):返回 x 二进制表示中 1 的个数。
__builtin_parity(x) / __builtin_parityll(x):返回 x 二进制表示中 1 的个数的奇偶性。0 为偶数、1 为奇数。
__builtin_ffs(x) / __builtin_ffsll(x):返回 x 的二进制表示的最后一个 1 在第几位。
__builtin_sqrt(x) / __builtin_sqrtf(x) / __builtin_sqrtl(x):返回 x 的开平方。(x 的类型默认为 double)
6. 关于随机数
- 不要使用
rand()!
- 可以使用
mt19937、minstd_rand、minstd_rand0 等 RNG。
- 种种子方法:设 RNG 为
Rng,则可以使用 Rng rng(random_device {}()) 或 Rng rng(clock() + time(nullptr)) 种随机种子。
Ex. 附录
- C++ 自带函数、关键字:
y0、j0、max、min、y1、j1、yn、jn、next、prev······