二分AC代码:
#include<cstdio>
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
bool dichotomy(int p[],int m,int n)
{
int left=0,right=m-1,middle;
while(left<=right)
{
middle=(left+right)/2;
if(n>p[middle])
{
left=middle+1;
}
else if(n<p[middle])
{
right=middle-1;
}
else
{
return true;
}
}
return false;
}
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
{
int *p=new int[m];
int *q=new int[n];
for(int i=0;i<m;i++)
{
scanf("%d",&p[i]);
}
sort(p,p+m,cmp);
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
for(int i=0;i<n;i++)
{
if(dichotomy(p,m,q[i]))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}
注意二分的写法。如果求解对但是用的是别的写法,有可能超时。
例如这种写法就超时了:
bool dichotomy(int p[],int m,int n)
{
int left=0,right=m-1,middle;
while(left!=right)
{
middle=(left+right)/2;
if(n>p[middle])
{
left=middle;
}
else if(n<p[middle])
{
right=middle;
}
else
{
return true;
}
}
return false;
}
STL之set AC代码
#include<cstdio>
#include<set>
using namespace std;
int main()
{
int m,n,x,y;
scanf("%d %d",&m,&n);
{
set<int> s;
int *p=new int[n];
while(m--)
{
scanf("%d",&x);
s.insert(x);
}
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
for(int i=0;i<n;i++)
{
if(s.find(p[i])!=s.end())
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}