链接:
https://www.nowcoder.net/acm/contest/76/C
来源:牛客网
题意:给你两个集合,求出交集,没有的话输出empty。
来源:牛客网
题目描述
给你两个升序排列的集合,求出两个集合的交集。
输入描述:
有多个测试用例,输入到文件结束。 对于每一个测试用例: 第一行输入两个整数n,m(0<n,m<=1000000),分别代表第一个集合和第二个集合的元素的数量。 第二行输入n个整数,表示第一个集合中的元素,元素之间用空格隔开。 第三行输入m个整数,表示第二个集合中的元素,元素之间用空格隔开。 两个集合中的元素范围在[-1000000000,1000000000]区间内。
输出描述:
每个测试用例用一行来输出两个集合的交集的所有元素(元素用空格隔开且按升序排列),若交集为空则输出"empty"。
思路:一开始想用map直接标记,然后已经标记的就可以当做交集元素,恰好MLE(内存超限),然后又想了一个方法,数据100W,题目保证升序,所以先输入一个数组,然后输入第二个数组时,二分查找第一个数组看是否存在过,即可求出交集,时间O(nlogn)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[1000010],n,m,flag;
ll bfd(ll l,ll r,ll x)
{
ll mid=(l+r)>>1;
while(l<r)
{
if(a[mid]<x)l=mid+1;
else if(a[mid]>x)r=mid;
else return 1;
mid=(l+r)>>1;
}
return 0;
}
int main()
{
ll d;
while(~scanf("%lld%lld",&n,&m))
{
flag=0;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
for(ll i=1;i<=m;i++)
{
scanf("%lld",&d);
if(bfd(1,n+1,d))
{
if(flag==0)printf("%lld",d);
else printf(" %lld",d);
flag=1;
}
}
if(flag==1)printf("\n");
else printf("empty\n");
}
return 0;
}