HihoCoder 一下 第152周 区间求差

来源:互联网 发布:nba2012东部决赛数据 编辑:程序博客网 时间:2024/06/05 02:38


题目1 : 区间求差

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1A2 ], [ A3A4 ], ..., [ A2N-1A2N ],集合 B 包含 M 个区间[ B1B2 ], [ B3B4 ], ..., [ B2M-1B2M ]。求 A - B 的长度。

例如对于 A = {[2, 5], [4, 10], [14, 18]}, B = {[1, 3], [8, 15]}, A - B = {(3, 8), (15, 18]},长度为8。

输入

第一行:包含两个整数 N 和 M (1 ≤ NM ≤ 100000)。

第二行:包含 2N 个整数 A1A2, ..., A2N (1 ≤ Ai ≤ 100000000)。

第三行:包含 2M 个整数 B1B2, ..., B2M (1 ≤= Bi ≤ 100000000)。

输出

一个整数,代表 A - B 的长度。

样例输入
3 22 5 4 10 14 181 3 8 15
样例输出
8
A - B = A  - (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;}