就是一个a数组。一个b数组。
各有n 和 m 个数。0<=n,m<=100000;
然后输出:
a与b 的交集,
a与b 的并集,
a交b 在 a 的补集。
开始就2个循环,结果超时了,然后用二分查找a 中 b[i] 是否存在,然后用vis 数组标记。
最后输出。AC。
PS:注意,某行没有输出就不输出\n;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int half(int *a,int len,int key)
{
int l=0,r=len;
while(l<r)
{
int m=(l+r)>>1;
if(key<a[m])r=m;
else if(key>a[m])l=m+1;
else return m;
}
return -1;
}
int main()
{
int n,m;
int a[100001],b[200001];
bool vis[100001];
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&b[i]);
int tmp=half(a,n,b[i]);
if(tmp!=-1)vis[tmp]=1;
}
bool ok=0;
for(int i=0;i<n;i++)
{
if(vis[i])
{
printf("%d ",a[i]);
ok=1;
}
else b[m++]=a[i];
}if(ok)printf("\n");
sort(b,b+m);
for(int i=0;i<m;i++)
printf("%d ",b[i]);
printf("\n");
ok=0;
for(int i=0;i<n;i++)
{
if(!vis[i])
{
printf("%d ",a[i]);
ok=1;
}
}if(ok)printf("\n");
}