集合的并

给出两个由整数组成的集合 A B ,计算 A    B 中包含多少个整数。 Input
输入的第一行包含一个整数 T  ( T  > 0),表示一共有 T 组测试数据。
对于每组测试数据,第一行包含一个整数 n  (1    n   10 5 )。第二行包含2 n 个整数 a 1 b 1 a 2 b 2 , ...,  a n b n  (0 <  a 1    b 1  <  a 2    b 2  < ... <  a n    b n  < 10 9 ),表示 A  = [ a 1 b 1  [ a 2 b 2  ...   [ a n b n ]。第三行包含一个整数 m  (1    m   10 5 )。第四行包含2 m 个整数 c 1 d 1 c 2 d 2 , ...,  c m d m  (0 <  c 1    d 1  <  c 2    d 2  < ... <  c m    d m  < 10 9 ),表示 B  = [ c 1 d 1  [ c 2 d 2  ...   [ c m d m ]。
这里[ 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}。
这道题当时做了很久都没做出来。。。经过别人帮助才想明白。就是先定义结构体p里面包含x,y,x代表起点,y代表终点,按照x进行升序排序,按顺序访问排好序的起点终点,分情况进行运算求结果。
#include<iostream>
#include<algorithm>
using namespace std;
#define max 200000
struct line
{
	int x,y;
}p[max];
bool cmp(line a,line b)
{
	return a.x<b.x;
}
int main()
{
	int T,n,m,i,c,sum;
	cin>>T;
	while (T--)
	{
		c=0;
		sum=0;
		cin>>n;
		for (i=0;i<n;i++)
			cin>>p[i].x>>p[i].y;
		cin>>m;
		for (i=n;i<n+m;i++)
			cin>>p[i].x>>p[i].y;
		sort(p,p+n+m,cmp);
		for (i=0;i<n+m;i++)
		{
			if (p[i].x>c) c=p[i].x;
			if (p[i].y>=c) 
			{
				sum=sum+p[i].y-c+1;
				c=p[i].y+1;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章