読者です 読者をやめる 読者になる 読者になる

とりになりたいかものはし

プログラミング(主に競プロ)に関するひとりごとなど

JOI本選前日!

ついにやってきましたね!JOI本選!
さっきけものフレンズの上映会で2話まで見てIQを溶かしてきたplatypusです。
プロたちはもっと見るらしいのですが僕は本選余裕勢ではないのでほどほどに切り上げました…

とりあえず明日の戦略でも書いておきます。

まず始まった直後はvimrcとすべてのプログラムの先頭に使うテンプレートファイルを作ります。

.vimrcはこちら

set nu ts=4 sw=4 et cin sta mps+=<:> nowrap
sy on
"commands for debugging
command! DBG execute "!g++ -std=c++11 -Wall -O0 -g ".expand("%:p")." -o ".expand("%:r")
command! RLS execute "!g++ -std=c++11 -Wall -O2 -DEVAL ".expand("%:p")." -o ".expand("%:r")
command! TST execute "!./".expand("%:r")." <in.txt"

テンプレートはこちら

#include <bits/stdc++.h>
using namespace std;
#define REP(i,x) for(int i = 0;i < x;++i)
#define FOR(i,x,y) for(int i = x;i < y;++i)
#define ALL(a) a.begin(),a.end()
using ll = long long;

int main()
{
    return 0;
}

うーん、少し盛り過ぎでしょうか…
特にvimrcの1行目、すごく不安です。でも明日のために一生懸命暗記してきたから大丈夫なはず…!(フラグ)
C++テンプレートの方は割と無難ではないでしょうか。
vimの:rコマンドを使って先頭に埋め込んでいきますね

この時点で15分程度立っていると予想… 落ち着いて…
それで、次は普通に1問目を見ます。普段の自分ならば解けるはずの難易度(超絶死亡フラグ)なので、そのまま満点を狙います
まあでも絶対緊張してバグを発生させると思うので、DDD(Data Display Debugger)の設定も合間にしておきます。
実はそのまま使うとvectorの中身を表示できないという欠点があるので、ユーザー定義コマンドを付け加えます。
vectorのoperator[]関数がインラインなせいでDDDでは反応してくれないんですよね… なので生ポインタから直接たどるしかないんです…)

define vecp
  if $arg1<0 || $arg1>=$arg0.size()
    print "Out of range"
  else
    print $arg0._M_impl._M_start[$arg1]
  end
end
define veca
  set $i = 0
  while $i < $arg0.size()
    vecp $arg0 $i
    set $i = $i + 1
  end
end

これらのコマンドで、vectorの要素をボタン1つで見ることができるようになります。
あとは頑張ってブレークポイントをポチポチしてデバッグをひたすらがんばります。

2問目、これはもしかしたら躓くかもしれないので、もしさっぱりだったら3問目も目を通します。
解法を思いついてからプログラムを書き終わるまで自分は平均30~45分程かかり、
バグを埋め込んでしまうと一気にまた30分ほど潰してしまいます。
そのため、競技時間4時間は圧倒的に短いと思っているので
わからない問題があるくらいだったら4,5の部分点でももぎ取っておいたほうがまだましだと思っています。
4,5問目は部分点狙いですが、部分点だったとしても決してコード量が減るわけではないので、時間を多めにとって
ラスト30分位になったら書き始めようと思います。
それでは今日はもうぐっすり寝て、明日に備えようと思います。おやすみなさい!


P.S. 推敲していない文章なので、間違いがあれば言ってください!