二分查找模板
模板一(在数组中查找第一个大于等于x的数的下标):
int seek(int x,int l,int r)
{
while(l < r)
{
int mid = l + r >> 1;
if(q[mid] >= x) r = mid;
else l = mid + 1;
}
return l;
}
模板二(在数组中查找最后一个小于等于x的数的下标):
int seek(int x,int l,int r)
{
while(l < r )
{
int mid = l + r + 1 >> 1;
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
return l;
}
模板三(在数组中查找第一个大于x的数的下标):
int seek(int x,int l,int r)
{
while(l < r )
{
int mid = l + r >> 1;
if(q[mid] > x) r = mid;
else l = mid + 1;
}
return l;
}
模板四(返回查找等于该x的数的下标)
int seek(int x,int l,int r)
{
while(l <= r)
{
int mid = l + r >> 1;
if(q[mid] == x) return mid;
if(q[mid] > x) r = mid - 1;
else l = mid + 1;
}
return l;
}
二分答案模板
常用的二分答案模板1
int l,r;
while(l <= r)
{
int mid = (l + r) >> 1;
if(check(mid)) {
l = mid + 1;
//res = mid;
}else {
r = mid - 1;
//res = mid;
}
}
return res;
常用的二分答案模板2
int l,r;
while(l < r)
{
int mid = (l + r) >> 1;
if(check(mid)) l = mid
else r = mid - 1;
}
return l;
常用的二分答案模板3
int l,r;
while(l < r)
{
int mid = (l + r) >> 1;
if(check(mid)) r = mid
else l = mid + 1;
}
return r;
实数二分答案
//eps为精度控制
double l,r;
while (r - l > eps) {
double mid = (l + r) >> 1;
if (check(mid)) {
l = mid;
} else {
r = mid;
}
}
本分享还不完善,接下来会继续完善,欢迎大家来评论区提意见