- masashinakata
- 5786
- 1
- 2
- 0
みさわ
@Mi_Sawa
整数二分探索, int res=l; for(int d=(十分でかい2^n); d; d>>=1) if(res+d <= r && ok(res+d)) res += d; すると間違えない. (n回目)
2014-07-19 20:43:56
とーらす🌸📦🌕✨🍀
@torus711
ub, lb をもつ整数二分探索、lb と ub のどっちが condition を満たすのか意識しておくとちょっとよさげ。そうすると素直に ( ok( mid ) ? lb : ub ) = mid と書ける。ループは while ( lb + 1 < ub )
2014-07-19 20:47:33
わふならず
@wfnarazu
いわゆる繰り返し二乗法では2ベキ作ってく方が好きなんだけど,整数の二分探索は (l+r)/2 するなあ,[l,r) もしくは (l,r] が不変条件になってたら間違えようがない.
2014-07-19 20:51:07
くりんぺっと
@climpet
あんまりそういう問題見たことはないけど,もし二分探索的なことを負の数を含む区間について行おうとした場合,[l,r) なら問題ないはずだけど, [l,r] だと除算の切り捨て方向の問題で死ぬ場合があるので注意
2014-07-19 20:54:08
Masaki Hara
@qnighy
l,r,mにおける二分探索では、1次元領域を「A:条件を満たしている」「B:不明」「C:条件を満たしていない」の3区間に分割する。そのうえで、Aの最大元がl, Cの最小元がrという不変条件を保ちつつ、(r-l)が指数的に1まで減少するループを書けばよい。
2014-07-19 21:05:13
Masaki Hara
@qnighy
@qnighy ある値以上の整数全体がwell-orderなのでループの停止性がわかり、特にその速度が指数的であることもわかる。
2014-07-19 21:06:55
Masaki Hara
@qnighy
@qnighy また、ループの脱出条件はr - l <= 1であるが、実はr - l >= 1という不変条件が保たれるので、脱出時にはr - l == 1が成立し、したがって「B:不明」という区間は脱出時に消滅していることがわかる。
2014-07-19 21:07:22