直接上题目:
Description
给出两个由整数组成的集合
A
,
B
,计算
A
∪
B
中包含多少个整数。
给出两个由整数组成的集合
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
)所有整数组成的集合。
输入的第一行包含一个整数
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
中包含多少个整数
。
对于每组测试数据,输出
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}。
对样例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的,一开始题目看错,结果去求了集合A并B。。后来队友即使发现问题,也做了半天。最后我发现这道题是一道结构体排序题。。将每次输入的两个数分别分成两个区间,假如输入六个数,则按第一个,第三个,第五个,第二个 ,第四个,第六个这样排序。如果他们的左区间相等,则按右区间降序排。如果不等,则左区间升序排。然后开始左右对应区间进行比较。如果右比做大,则右减左加一。让左等于右去减的那个再加一。再看右是否比左大。以此类推,遍历所有情况。就是最优解。下面是代码。。
#include <stdio.h>
#include<algorithm>
using namespace std;
#define max 2500000
struct node
{
int x,y;
}
f[max];
bool cmp(node d,node e)
{
if(d.x!=e.x)
return d.x<e.x;
else
return d.y>e.y;
}
int main()
{
int t,i,wbx,sum,cc,c;
scanf("%d",&t);
while(t--)
{
sum=0;wbx=0;
scanf("%d",&cc);
for(i=0;i<cc;i++)
scanf("%d%d",&f[i].x,&f[i].y);
scanf("%d",&c);
for(i=cc;i<cc+c;i++)
scanf("%d%d",&f[i].x,&f[i].y);
sort(f,f+cc+c,cmp);
for(i=0;i<cc+c;i++)
{
if(f[i].x>wbx)
wbx=f[i].x;
if (f[i].y>=wbx)
{
sum+=f[i].y-wbx+1;
wbx=f[i].y+1;
}
}
printf("%d\n",sum);
}
return 0;
}