原题链接:https://www.luogu.com.cn/problem/P2249#submit
用这个二分的基础题目来复习一下二分的基础模板和lower_bound()函数
y总模板做法
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int a[N];
int q, m;
int main()
{
scanf("%d %d", &n, &m);
//cin >>n >> b;
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
for(int i = 1; i <= m; i ++)
{
scanf("%d", &q);
int l = 1, r = n;
while(l < r)
{
int mid = l + r >> 1;
if(a[mid] >= q) r = mid;
else l = mid + 1;
}
if(a[l] == q) cout << l <<' ';
else printf("-1 ");
}
return 0;
}
函数写法
#include<cstdio>
using namespace std;
int n,m,q,a[1000005];
int find(int x) //二分查找
{
int l=1,r=n;
while (l<r)
{
int mid=l+r>>1;
if (a[mid] >= x) r=mid;
else l=mid+1;
}
if (a[l]==x) return l; //找都了就输出他的位置
else return -1; // 没找到输出-1
}
int main()
{
scanf("%d %d",&n,&m); //读入
for (int i=1 ; i<=n ; i++)
scanf("%d",&a[i]); //还是读入
for (int i=1 ; i<=m ; i++)
{
scanf("%d",&q);
int ans=find(q); //看看查找的结果
printf("%d ",ans); //输出
}
return 0;
}
lower_bound()大法
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n, m, q;
int a[N];
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++)
cin >> a[i];
for(int i = 1; i <= m; i ++)
{
cin >> q;
int idx = lower_bound(a, a + n, q) - a;
if(a[idx] == q) cout << idx + 1 << ' ';//这里是因为编号是从1开始的
else printf("-1 ");
}
return 0;
}