二分查找题目(持续更新)
\(1.\) \(CF835E\)
单调递增序列中查找第一个 \(\leqslant x\) 的数
细节: \(l+r\) 的写法要与 \(mid\) 的写法配套。
$View$ $Code$int a[MAX]; int leqs(int l,int r,int x) { while(l>1; if(a[mid]>=x) r=mid; else l=mid+1; } return a[l]; }
单调递增序列中查找第一个 \(\geqslant x\) 的数
$View$ $Code$int a[MAX]; int geqs(int l,int r,int x) { while(l>1; if(a[mid]<=x) l=mid; else r=mid-1; } return a[l]; }
实数域上的二分(可以确定精度,保留 \(k\) 位小数)
细节:左右 \(mid\) 的写法相同。
$View$ $Code$int k,l=0,r=MAXN; const double eps=1e-(k+2); while(r-l>eps) { double mid=(l+r)/2; if(calc(mid)) r=mid; else l=mid; }
实数域上的二分(不能确定精度)
$View$ $Code$int tms=MAX,l=0,r=MAXN; for(register int i=1;i<=tms;i++) { double mid=(l+r)/2; if(calc(mid)) r=mid; else l=mid; }