集合的並

給出兩個由整數組成的集合 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;
}

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