cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み
スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、
言語というかライブラリによって意外と違うのが標準入出力の速度で、入力サイズ N の線形オーダ O(N) で解かないといけない類の問題では、注意しないとデータを読み込むだけでタイムアウトするのも日常茶飯事です。その辺の心配はないのか調べてみました(今までDでそういう問題解いたことがなかったのでした…)。以下、
をとった結果です(単位は秒)。最適化ありというのは g++ -O3 と dmd -O -release -inline で、なしというのは引数なし。
プログラム | 最適化あり | 最適化なし |
---|---|---|
(1) C++ iostream (手抜き) | 5.224 | 5.428 |
(2) C++ iostream (真面目) | 1.119 | 1.155 |
(3) C++ scanf | 0.499 | 0.507 |
(4) D readln+split+to!int | 1.078 | 1.529 |
(5) D readln+split+map!(to!int) | 1.072 | 1.545 |
(6) D readf | 1.958 | 2.335 |
(7) D scanf | 1.393 | 1.410 |
なにかの優劣比較をしたいわけではないので、まったくひとかけらも厳密なベンチマークではありませんが、結論としては、まあ readln + split で問題ないのではないでしょうか、と思いました。というか、だいたいこんなオーダなのでOnline JudgeにD言語を入れる人は参考にしていただければという感じです。あと iostream が遅くてコンテストで困るという人はまずは tie(0) と sync_with_stdio(false) を (定期発言)。
// (1) C++ iostream (手抜き) #include <iostream> using namespace std; int main() { long long total = 0; for(int a,b,c; cin>>a>>b>>c; ) total += a+b+c; cout << total << endl; }
// (2) C++ iostream (真面目) #include <iostream> using namespace std; int main() { cin.tie(0); ios_base::sync_with_stdio(false); long long total = 0; for(int a,b,c; cin>>a>>b>>c; ) total += a+b+c; cout << total << endl; }
// (3) C++ scanf #include <cstdio> using namespace std; int main() { long long total = 0; for(int a,b,c; scanf("%d%d%d",&a,&b,&c)==3; ) total += a+b+c; printf("%lld\n", total); }
// (4) D readln + split + to!int import std.array; import std.conv; import std.stdio; void main() { long total = 0; for(string s; (s=readln()).length; ) { auto ss = s.split(); int a = ss[0].to!int(); int b = ss[1].to!int(); int c = ss[2].to!int(); total += a+b+c; } writeln(total); }
// (5) D readln + split + map!(to!int) import std.algorithm; import std.array; import std.conv; import std.stdio; void main() { long total = 0; for(string s; (s=readln()).length; ) { auto ss = s.split().map!(to!int); total += ss[0]+ss[1]+ss[2]; } writeln(total); }
// (6) D readf import std.array; import std.conv; import std.stdio; void main() { long total = 0; for(int a,b,c; readf("%d %d %d\n",&a,&b,&c); ) total += a+b+c; writeln(total); }
// (7) D scanf import std.c.stdio; void main() { long total = 0; for(int a,b,c; scanf("%d%d%d\n",&a,&b,&c)==3; ) total += a+b+c; printf("%lld\n", total); }
presented by cafelier/k.inaba under