考前须知

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/printfcout/scanf
  • 变量名不要和 C++ 自带函数、关键字(清单见文章最后)重名!

4. 关于对拍

  • 对拍流程:(设题目名为 lylakioi
    • 准备 gen.cpp(用于造数据)、std.cpp(保证正确性的代码)、和 lylakioi.cpp(需要测试的代码)。
    • 编译这三份代码。(建议 gen.cppstd.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_dsrope 等。
  • 可用函数清单:
    • __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()
  • 可以使用 mt19937minstd_randminstd_rand0 等 RNG。
  • 种种子方法:设 RNG 为 Rng,则可以使用 Rng rng(random_device {}())Rng rng(clock() + time(nullptr)) 种随机种子。

Ex. 附录

  • C++ 自带函数、关键字:y0j0maxminy1j1ynjnnextprev······
posted @ 2025-08-02 16:14  David9006  阅读(6)  评论(0)    收藏  举报