AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

整数二分模板

作者: 作者的头像   wuog ,  2019-07-23 11:48:56 ,  所有人可见 ,  阅读 1560


1


1
## 基本思想:二分
   易错点:边界问题(+1问题)
----------
## 本质
   有某一个种性质,将整个区间一分为二,就可二分出边界点,所以就产生了两个边界点。
## 例如
   3 6 6 9 10 求取6的起始坐标
   mid =(0+5-1)/2=2
   起始位置更新获取6的位置,长度缩小一半为 3 6 6
     然后末位置更新获取6位置(先确定边界与性质)
    有可能有一些情况又无解的,但是二分一定是有解的,这个问题是题目问题

代码模板解释

bool check(int x) {}
// 检查x是否满足某种性质,更新区间

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
//更新 l,r
if (check(mid)) r = mid;
// check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
//+1->为了解决l,r更新失败(死循环)问题
int mid = l + r + 1 >> 1;
//更新 l,r
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}

模板

int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
}
```

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息