一些有用但没用的东西
ioi 打完就想发了,鸽到了现在,写点关于交互题的东西。
我是一个主用 vim 写代码的人,用 gdb 调试的人。
我在写交互题的时候(或任何要多文件编译的时候),或多或少会有些难受。在以前我会采取编写代码时,将交互库贴到我代码前变为单文件编译,最后再删掉前面多文件编译检查。即使这样也会比较难受。
后来我发现了一种比较好的解决方案:
// filename : test.cpp
#include "akioi.h"
#include "grader.cpp"
void solve(int n) {
}
注意,这样还是可能访问到 grader.cpp 内变量,建议还是要多文件编译检查一下
上面说到,我是 gdb 调试的选手,gdb 在处理多文件时候依然会比单文件难受,主要是你在使用 b/break
命令时候,gdb 不知道你说的是哪个文件,它一般采用你上一次使用 list
展示代码的文件,没有就是 main 所在文件(可能不对,但我目前看来是这样)。也就是说,你打开 gdb 就是一个 break
,它是 break
在 grader.cpp 的,这一般不是你写交互题时候想要的。而如果你在一开始使用了 list test.cpp:1,0
,那么后面 break
都会是在 test.cpp
。
当然,作为一个优秀的鸽子,我当然是不想每次打开 gdb 就先打个 list test.cpp
的,我发现 gdb 有个参数是 --eval-command
,它会在所有命令前运行。因此我们把 gdb 启动命令从 gdb test
改成 gdb test "--eval-command=list test.cpp:1,0"
就可以了(可能有转义问题,有的话大家自己调调),这完全是可以写进 vim 配置的,而且传统题使用这条指令也是完全没有问题。
这都是训练 ioi 时候写交互写疯了整出的的东西,而且 ioi 试机赛时候才搞好