まだ手元実行で消耗してるの?
はじめに
以下のコードを手元でコンパイルして実行してみてください
#include <bits/stdc++.h> using namespace std; const int LIM = 1e6+3; int dfs(int x){ if(x==LIM) return 1; if(x&1) return (dfs(x+1)+x)%LIM; return dfs(x+1)*(long long)x%LIM; } signed main(){ cout<<dfs(1)<<endl;; return 0; }
これは実行すると segmentation fault する人向けの記事です
なんぞこれ
1e6頂点とかのグラフに対してDFSするとセグフォして死ぬことがあります
多くのコンテストサイトではスタックサイズが(実質)無限なので気にする必要はあんまりないんですが、FHC のような手元で実行して結果を提出する形式の時に困ります(話が逸れるんですがO2つけ忘れたり-D_GLIBCXX_DEBUGをつけっぱなしにしていてTLEしたりもします)
以下では環境ごとの対策を挙げます
Ubuntu
ICPCは基本これでOK ジャカルタ?知らないRegionですね…
ulimit -s unlimited
Mac
コンパイルオプションを足す
alias g++='g++ -O2 -Wall -Wextra -Wl,-stack_size,0x10000000'
WSL
コンパイルオプションを足す 2020/08/06追記 オプション足りてませんでした(ア 2020/08/26追記 -fsplit-stack だけじゃないと動かない環境もあるみたいです(イ
alias g++='g++ -O2 -Wall -Wextra -fsplit-stack -Wl,-stack,0x10000000'
参考: