给出两个由数字组成的集合,请求这两个集合的“交”和“并”。
输入格式:
给一个n,m 代表两个数列的大小 (0 <= n,m <=2e5)如果n>0,则接下来一行,
n个数空格隔开,代表第一个集合中的数。如果m>0,则接下来一行, m个数空格隔开,代表第二个集合中的数。-1e9<=ai,bi<=1e9
输出格式:
第一行首先输出两个数列交的集合中元素个数,如果元素个数大于0,则紧接着在这行输出“交集”的元素,按数值大小升序排列(本行输出多个数据时,用空格隔开,如果只有一个元素个数,行末无空格)第二行首先输出两个数列并的集合中元素个数,如果元素个数大于0,则紧接着在这行输出“并集”的元素,按数值大小升序排列(本行输出多个数据时,用空格隔开,如果只有一个元素个数,行末无空格)
输入样例1:
1 3
1
1 3 4
输出样例1:
1 1
3 1 3 4
输入样例2:
1 3
1
2 3 4
输出样例2:
0
4 1 2 3 4
思路:
并集好说本身元素不重复且从小到大自动排序
交集就如下语句
if(s.find(*it) != s.end()) jiao.insert(*it);
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
set<int> f,s,jiao;
for(int i = 0; i < n; i++)
{
int a;
cin >> a;
f.insert(a);
}
for(int j = 0; j < m; j++)
{
int b;
cin >> b;
s.insert(b);
}
for(set<int>::iterator it = f.begin(); it != f.end(); it++) //求交
{
if(s.find(*it) != s.end()) jiao.insert(*it);
}
for(set<int>::iterator it = s.begin(); it != s.end(); it++) //求并
{
f.insert(*it);
}
//输出
cout << jiao.size();
for(set<int>::iterator it = jiao.begin(); it != jiao.end(); it++) //求并
{
printf(" %d",*it);
}
cout << endl;
cout << f.size();
for(set<int>::iterator it = f.begin(); it != f.end(); it++) //求并
{
printf(" %d",*it);
}
return 0;
}