题目描述:
点击进入题目(https://www.luogu.com.cn/problem/P2249)
题意理解:
由于这题数据单调有序,所以可以用二分查找来做,算法复杂度 O ( n l o g n ) O(nlogn) O(nlogn),思路就是如果a[mid]这
个数大于等于x,右等于mid,否则左等于mid+1。
那么,常说的,二分查找和二分答案的区别是什么呢:
二分查找通常是n次询问,每次询问的复杂度是 O ( l o g n ) O(logn) O(logn)
二分答案通常是1次询问,每次询问的复杂度是 O ( l o g n ) O(logn) O(logn),具体是在check函数的地方复杂度是 O ( n ) O(n) O(n)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int n,q,a[N];
int main()
{
cin>>n>>q;
for(int i=0; i<n; i++)
cin>>a[i];
while(q--)
{
int x;
cin>>x;
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x)
r=mid;
else
l=mid+1;
}
if(a[l]!=x)
cout<<"-1 ";
else
cout<<l+1<<" ";
}
return 0;
}