CSU_1409: 集合的并

Description

给出两个由整数组成的集合A,
B,计算A

B中包含多少个整数。

Input

输入的第一行包含一个整数T (T > 0),表示一共有T组测试数据。

对于每组测试数据,第一行包含一个整数n (1

n ≤ 105)。第二行包含2n个整数a1,
b1,
a2,
b2, ...,
an,
bn (0 <
a1

b1 <
a2

b2 < ... <
an

bn < 109),表示A
= [a1,
b1]
∪ [a2,
b2]
∪ ...
∪ [an,
bn]。第三行包含一个整数m
(1 ≤
m ≤ 105)。第四行包含2m个整数c1,
d1,
c2,
d2, ...,
cm,
dm (0 <
c1

d1 <
c2

d2 < ... <
cm

dm < 109),表示B
= [c1,
d1]
∪ [c2,
d2]
∪ ...
∪ [cm,
dm]。

这里[x,
y]表示由x,
y之间(包含x,
y)所有整数组成的集合。

Output

对于每组测试数据,输出A

B中包含多少个整数。

Sample Input

3
1
7 7
1
3 3
2
1 2 3 4
1
2 3
2
1 2 4 6
3
1 3 6 7 9 10

Sample Output

2
4
9

HINT

对样例1的解释:A = {7},B = {3},A

B = {3, 7}。

对样例2的解释:A = {1, 2, 3, 4},B = {2, 3},A

B = {1, 2, 3, 4}。

对样例3的解释:A = {1, 2, 4, 5, 6},B = {1,
2, 3, 6, 7, 9, 10},A

B = {1, 2, 3, 4, 5, 6, 7, 9, 10}。

Source

中南大学第八届大学生程序设计竞赛

//可以把A,B,都当成多条线段的集合,然后,排序,去重,那么最后结果就是问所有的线段包含了多少个整数。通过结构体把a,b绑定起来,然后排序,先按左边小的排,在按右边大的排,这样是为了覆盖重复的。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=200005;
int n,m;

struct point
{
    int x,y;
}f[maxn];

bool mycomp(const point &a,const point &b)
{
    if(a.x!=b.x) return a.x<b.x;
    else return a.y>b.y;
}

void solve()
{
    int i,ans = 0;
    int start=0;
    for(i=0;i<n+m;i++)
    {
        if(f[i].x>start) start=f[i].x;
        if (f[i].y>=start)
        {
            ans+=f[i].y-start+1;
            start = f[i].y+1;
        }
    }
    printf("%d\n",ans);
}

int main()
{
    int t,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++) scanf("%d %d",&f[i].x,&f[i].y);
        scanf("%d",&m);
        for(i=n;i<m+n;i++) scanf("%d %d",&f[i].x,&f[i].y);
        sort(f,f+n+m,mycomp);
        solve();
    }
    return 0;
}
时间: 2024-08-03 07:10:53

CSU_1409: 集合的并的相关文章

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

C#语言中数组和集合

数组.集合→用于储存多个同类型的数据数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快集合 不定长→保存的数据数量,可以在程序的执行过程中,发生变化 占用内存多 便利速度慢课时六:数组和集合 数组.集合→用于储存多个同类型的数据 数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快 集合 不定长→保存的数据数

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

Java 之集合

collection(单列集合) List(有序,可重复) ArrayList     底层数据结构是数组,查询快,增删慢,线程不安全,效率高 Vector     底层数据结构是数组,查询快,增删慢,线程安全,效率低 LinkedList  底层数据结构是链表,查询慢,增删快,线程不安全,效率高 Set(无序,唯一) HashSet   底层数据结构是哈希表,依赖hashCode()和equals() 执行顺序:判断hashCode()是否相同,相同继续执行equals(),返回true不添加

集合和三元运算符

一.三元运算符 如下判断可以使用三元运算更方便的实现: a = 1b = 2 if a > 1: c = aelse: c = b 和下面是一样的: a = 1b = 2#下面这个c = a if a>1 else b 如下两种方法也是一样的:方式一: s=[]nums = list(range(1,11))for i in nums: if i%2==0: s.append(i)print(s)方式二:ss = [i for i in nums if i%2==0]print(ss)#这两种

集合函数 day4

1.集合 通过set强制转换,或者直接定义 1 nums = [0, 2, 4, 6, 8]#两种格式,带大括号与带中括号的 2 print(type(nums)) 3 aa = {0, 8, 2, 4, 6}#需要注意与字典的区别,字典是有分号的 2.交集

js算法集合(一) 水仙花数 及拓展(自幂数的判断)

js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,希望能对大家有所帮助. 1.验证一个数是否为水仙花数 ①要写水仙花数的算法,我们首先来了解一下什么是水仙花数,水仙花数是指一个 3位正整数 ,它的每个位上的数字的 3次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153): ②了解了什么是水仙花数我们就开始分析该怎么下手.通过定义来看

笔记:多线程-集合

阻塞队列(BlockingQueue) 当试图向队列添加元素而队列已满,或是想从队列移除元素而队列为空的时候,阻塞队列导致线程阻塞,阻塞队列接口定义如下,他继承Queue<E>接口: public interface BlockingQueue<E> extends Queue<E> { ????/** ???? * 添加一个元素,如果队列满,则抛出 IllegalStateException异常 ???? */ ????????boolean add(E e); ??

SQL入门之集合操作

尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下面两个要求: 两个数据集合必须具有同样数目的列 连个数据集中对应列的数据类型必须是一样的(或者服务器能够将其中一种类型转换为另一种类型) SQL语言中每个集合操作符包含两种修饰:一个包含重复项,另一个去除了重复项(但不一定去除了所有重复项). 0.union操作符 union和union all操作