码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-14 18:47:47      阅读:410      评论:0      收藏:0      [点我收藏+]

标签:

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);
 
    }
 
}

 

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

标签:

原文地址:http://www.cnblogs.com/cwenliu/p/5873043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!