ac 789数的范围
二分法的模板
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;
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)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
例题的解法就是用二分查找那个数字
#include<bits/stdc++.h>
using namespace std;
void help(int num, vector<int>&nums) {
int l = 0, r = nums.size() - 1;
while(l < r) {
int mid = r + l >> 1;
if (nums[mid] >= num) r = mid;
//这个if一直找到比num小的数字,然后执行else刚好等于num(如果存在num的话)
else l = mid + 1;
}
if (nums[l] != num) cout << "-1 -1" << endl;
else {
cout << l << ' ';
int l = 0, r = nums.size() - 1;
while(l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] <= num) l = mid;
//同上,这里是找比num大的
else r = mid - 1;
}
cout << l << endl;
}
}
int main() {
vector<int> nums;
int num, q;
cin>> num >> q;
for(int i = 0 ; i < num; i++) {
int temp;
cin >> temp;
nums.push_back(temp);
}
for(int i = 0; i < q; i++) {
int temp;
cin >> temp;
help(temp, nums);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!