Problem A: 求集合的交并补集
Time Limit: 1 Sec Memory Limit: 4 MB
Submit: 3663 Solved: 1041
[Submit][Status][Web Board]
Description
任意给定两个包含1-30000个元素的集合A,B(集合中元素类型为任意整型数,且严格递增排列),求A交B、A并B、A-B和B-A集合。
Input
输入第一行为测试数据组数。每组测试数据两行,分别为集合A、B。每行第一个数n(1<=n<=30000)为元素数量,后面有n个严格递增的绝对值小于2^31代表集合中包含的数。
Output
对每组测试数据输出5行,第1行为数据组数,后4行分别为按升序输出两个集合的A交B、A并B、A-B和B-A集合。格式见样例。
Sample Input
1
3 1 2 5
4 2 3 5 8
Sample Output
Case #1:
2 5
1 2 3 5 8
1
3 8
HINT
考察知识点:有序表合并,时间复杂度O(n),空间复杂度O(n)
#include<bits/stdc++.h> #define BEND(x) x.begin(),x.end() #define INS(x) insert_iterator<set<int> >(x,x.begin()) using namespace std; set<int> :: iterator it; set<int> A,B,C; void puts(set<int> &S){ for(it = S.begin(); it != S.end(); ++it){ if(it == S.begin()) cout<<*it; else cout<<" "<<*it; } printf("\n"); } int main(){ int cases, n, m, i = 1; cin>>cases; while(i<=cases){ cout<<"Case #"<<i++<<":"<<endl; A.clear();B.clear(); cin>>n; while(n--){ cin>>m; A.insert(m); } cin>>n; while(n--){ cin>>m; B.insert(m); } C.clear(); set_intersection(BEND(A),BEND(B),INS(C)); puts(C); C.clear(); set_union(BEND(A),BEND(B),INS(C)); puts(C); C.clear(); set_difference(BEND(A),BEND(B),INS(C)); puts(C); C.clear(); set_difference(BEND(B),BEND(A),INS(C)); puts(C); } }
时间: 2024-10-05 06:32:42