FDU 2018 | 2. 集合交并

2024-03-20 22:04
文章标签 集合 2018 fdu

本文主要是介绍FDU 2018 | 2. 集合交并,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 题目描述
  • 2. 我的尝试
    • 1. C++容器
    • 2. 排序+二路归并

1. 题目描述

AcWing 3688 集合交并
输入两个集合,分别求其交集和并集中元素的个数,每个集合中可能存在相同的元素,而最终的交集和并集中应该不存在。

输入格式
第一行输入两个整数 n,m 表示两个集合中元素的个数。
第二行输入 n 个整数,表示第一个集合中的元素。
第三行输入 m 个整数,表示第二个集合中的元素。

输出格式
输出两个整数以空格分开,表示其交集和并集中元素的个数。

数据范围
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1n,m105, 给定集合元素取值范围 [ 1 , 1 0 9 ] [1,10^9] [1,109]

输入样例

4 5
3 4 7 3
4 6 3 2 6

输出样例

2 5

2. 我的尝试

1. C++容器

考察set基础用法

#include<stdio.h>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
set<int> a, b, c, d;
int n, m, x;
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i)scanf("%d", &x), a.insert(x);for (int i = 1; i <= m; ++i)scanf("%d", &x), b.insert(x);set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(d, d.begin()));printf("%d %d", c.size(), d.size());
}

2. 排序+二路归并

分别用两个数组来存两个集合并对其排序(此时未去重),排序后用类似二路归并的方法得到找到同时在两集合中出现的元素,得到交集(已去重)。并集元素个数可以用原始两集合元素的个数和减去交集元素个数得到。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;
int a[N], b[N];
vector<int> r;int main()
{int n, m;int cnt1 = 0, cnt2 = 0;cin >> n >> m;for (int i = 0; i < n; i ++) scanf("%d", &a[i]);for (int i = 0; i < m; i ++) scanf("%d", &b[i]);sort(a, a + n);sort(b, b + m);for (int i = 0; i < n; i++)if (i == 0 || a[i] != a[i - 1]) cnt1++;for (int j = 0; j < m; j++)if (j == 0 || b[j] != b[j - 1]) cnt2++;int i = 0, j = 0;while (i < n && j < m){if (a[i] < b[j]){i ++;while (i == 0 || (i < n && a[i] == a[i-1])) i++;if (i == n - 1 && a[i] == b[i-1]) break;}else if (b[j] < a[i]){   j ++;while (j == 0 || (j < m && b[j] == b[j-1])) j++;if (j == m - 1 && b[j] == b[j-1]) break;}else {r.push_back(a[i]);i++, j++;while (i == 0 || (i < n && a[i] == a[i-1])) i++;while (j == 0 || (j < m && b[j] == b[j-1])) j++;}}cout << r.size() << " " << cnt1 + cnt2 - r.size();
}

这篇关于FDU 2018 | 2. 集合交并的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830866

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据