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 試機賽時候才搞好