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

相关文章

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

hutool 集合相关交集、差集

开发过程中会遇到集合之间的对比之类的需求,之前经常会自己写个工具类来实现,目前hutool可以帮助我们解决很多问题,接下来我们就来实践下。 相关jar包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>RELEASE</version><scope>compile</sco

Java8中的Stream,让集合操作酸爽起来

简介 java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。 Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合