D言語to競技プログラミング

{\ }
最近ちょいちょいCode forcesの過去問とかをD言語で解いてるので、そのメモ

StopWatch(乱択とかでTLEギリギリまで回し続けるとか)

import std.datetime;

int main() {
	StopWatch sw;
	sw.start();
	while (sw.peek().msecs < 1800) {
		hoge();
	}
	return 0;
}

これは実行時間が1800msを超えたらループを抜けるコードですね…うわぁ…そのままだなぁ…

入力
Cfでよくある、
\(n\)
\(a_1\ a_2\ a_3\ ..\ a_n\)
という入力形式

import std.stdio, std.conv, std.string, std.algorithm, std.range;

int main() {
    int n;
    readf("%d\n", &n);
    auto a = readln().split().map!(to!int).array;
    return 0;
}

注意点としてはreadfの\nが無いとつらいって事ですね
速度は速くはないと思う
stdin.rawRead(new char[](2^^20))
とかで全部最初に読むと速いかも
速度で死んだので色々試してみた。
結果、core.stdc.stdioをimportしてscanfを叩くのが楽、当然だけどlongの読み込みに%ldとか使わなきゃいけない

builtin_popcount

import std.stdio;
import core.bitop;

int main() {
    writeln(popcnt(0b10010011101011)); //8
    writeln(popcnt(10)); //2
    return 0;
}

popcnt(uint i)でiの立ってるbitの数を数えます。

stack_size(macのみ)
macだとスタックオーバーフローがアレなので
dmd source.d -L-stack_size -L100000000 とか