题目1 : 区间求差
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
3 2 2 5 4 10 14 18 1 3 8 15
样例输出
-
8
描述
给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3, A4 ], ..., [ A2N-1, A2N ],集合 B 包含 M 个区间[ B1, B2 ], [ B3, B4 ], ..., [ B2M-1, B2M ]。求 A - B 的长度。
例如对于 A = {[2, 5], [4, 10], [14, 18]}, B = {[1, 3], [8, 15]}, A - B = {(3, 8), (15, 18]},长度为8。
输入
第一行:包含两个整数 N 和 M (1 ≤ N, M ≤ 100000)。
第二行:包含 2N 个整数 A1, A2, ..., A2N (1 ≤ Ai ≤ 100000000)。
第三行:包含 2M 个整数 B1, B2, ..., B2M (1 ≤= Bi ≤ 100000000)。
输出
一个整数,代表 A - B 的长度。
先对A,B 化简 -- 然后求交即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int x,y;
}A[5][100100];
bool cmp(node x,node y){
return x.x<y.x;
}
int n,m,n1,m1;
int ss()
{
sort(A[1]+1,A[1]+1+n,cmp);
sort(A[2]+1,A[2]+1+m,cmp);
n1=m1=0;
int ans=0;
int i=1,x,y;
while (i<=n)
{
x=A[1][i].x;
y=A[1][i].y;
i++;
while (i<=n&&A[1][i].x<=y){
y=max(y,A[1][i].y);
i++;
}
n1++;
A[3][n1].x=x;
A[3][n1].y=y;
ans+=y-x;
}
i=1;
while (i<=m)
{
x=A[2][i].x;
y=A[2][i].y;
i++;
while (i<=m&&A[2][i].x<=y){
y=max(y,A[2][i].y);
i++;
}
m1++;
A[4][m1].x=x;
A[4][m1].y=y;
}
return ans;
}
int sp(int i,int j){
return max(0,min(A[3][i].y,A[4][j].y)-max(A[3][i].x,A[4][j].x));
}
int ans(){
int ans=0;
int i,j;
i=j=1;
while (i<=n1&&j<=m1){
ans+=sp(i,j);
if (A[3][i].y>A[4][j].y)
j++;
else if (A[3][i].y<A[4][j].y)
i++;
else
i++,j++;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d%d",&A[1][i].x,&A[1][i].y);
for (int i=1;i<=m;i++)
scanf("%d%d",&A[2][i].x,&A[2][i].y);
printf("%d\n",ss()-ans());
return 0;
}