俺のchokudai Searchが遅すぎる
chokudai searchをするときに余裕を持ってTime Limitを設定してもTLEしてしまう話と解決法
問題
先日AHC002がありました.そこでchokudai seachを実装したのですが,TLを1600msにしてもTLEになってしまうことが多々ありました.
次のような実験をしたところ,関数のreturn直前ではTLくらいの時間しか経っていないにも関わらず,return直後ではTL + 数100ms経っていることが分かりました.
void chokudai_search(){ /* メインの処理 */ 時間の計測 // 1630ms return; } int main{ /* 前処理 */ chokudai_search(); 時間の計測 // 2030ms }
時間はテキトーですが,だいたいこんな感じです.
このことからchokudai searchで使った大量のキューの後処理が関数から返る時に走っていて,それが重いのだと予測しました.
解決法
関数から返る前に出力を済ませexit()を使う.
せや!関数から返る時の処理が重いんだったら返らなければええんや!と思い,次のようにしました.
void chokudai_search(){ /* メインの処理 */ 答えの出力 exit(0); // ここでプログラムを終了する } int main{ /* 前処理 */ chokudai_search(); }
すると,だいたいTLくらいで終わるようになりました.
さらに,ドキュメントを見るとexit()より早いquick_exit()があることが分かります.しかし,実験をするとなぜかexit()より遅いです. TLは1950msです.
上から
— 真紅色に染まるぷーん (@pu__Ne) 2021年4月25日
quick_exit(0)
abort()
exit(0) pic.twitter.com/6xjnPK4vOZ
さいごに
exit()が早い理由,quick_exit()がexit()より遅い理由,abort()が遅い理由すべて分かりません!!!!有識者HELP!!!!!!!!!!!!!
qLethonの提出 - https://atcoder.jp/contests/ahc002/submissions?f.User=qLethon