题目:
http://codevs.cn/problem/1230/
为什么做这一道题呢?
因为网上说只有10%的程序员可以写出二分查找
虽然过了,但也不能说我的代码一定正确;
吐槽:这道题用STL比手打要快=_=
第一个:sort+lower_bound;
第二个:手写归并+lower_bound;
第三个:手写归并+手写二分;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000001 + 55;
int a[MAXN],b[MAXN];
int n,m;
void merge_sort(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
merge_sort(l,mid),merge_sort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid && j<=r)
if(a[i]>a[j]) b[k++]=a[j++];
else b[k++]=a[i++];
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=l;i<=r;i++) a[i]=b[i];
return;
}
void solve()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
merge_sort(1,n);
int x;
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
int l=1,r=n+1;
while(r - l > 1)
{
int mid=(l+r)>>1;
if(a[mid]>x) r=mid;
else l=mid;
}
if(x==a[l])
printf("YES\n");
else
printf("NO\n");
}
return;
}
int main()
{
solve();
return 0;
}