首页 > 代码库 > (c++ 实现)山东科技大学 oj 求集合的交并补集(数据结构习题)

(c++ 实现)山东科技大学 oj 求集合的交并补集(数据结构习题)

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

13 1 2 54 2 3 5 8

Sample Output

Case #1:2 51 2 3 5 813 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);     } }

 

(c++ 实现)山东科技大学 oj 求集合的交并补集(数据结构习题)