2019年7月11日木曜日

(count 1 simple-bit-vector)を高速に扱えるのはstart, endが指定されていない場合だけ

(count 1 simple-bit-vector)を高速に扱えるのはstart, endが指定されていない場合だけ

ビット列を部分的に反転させたり、立っているビットを数えたりする問題。セグメント木などで解ける典型問題1だが、101010^{10}くらいなので、愚直シミュレーションをワードサイズ高速化しても十分間に合いそう。ANSI CLには十分な機能がないので、実装して通した

その後でSBCLのソースを眺めていると、どうやらcountにはsimple-bit-vector用のトランスフォームが定義されているらしい。これなら自分の実装はいらなかったなと思ったが、コードをよく見ると、引数にstartendがなく、ベクタ全体を数える場合にだけ適用されるdeftransformだった。範囲指定がある場合は通常通り1ビットずつ数えるので、まったく間に合わないようだ。

あと、logcountがpopcntになるのはバージョン1.2.8以降らしい。AtCoder以外のコンテストサイトのSBCLは確認できる限りすべて1.3.0以降なので、AtCoderのSBCLが新しくなれば考慮する必要がなくなりそう。


  1. とりあえず平衡二分木で通したのはこれ ↩︎