描述

桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。
格式

输入格式

输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。
输出格式

输出只有一行,一个整数,表示图形的面积。
样例1

样例输入1

3
1 1 4 3
2 -1 3 2
4 0 5 2
Copy
样例输出1

10

分析
将每个横坐标离散进一个数组里,每个纵坐标离散进一个数组里。
接着分别排序。
然后枚举,枚举离散x数组里的x[i]和x[i+1]以及离散y数组里的y[i]和y[i+1](就是一个个地求区块面积)
然后还要枚举原矩形的坐标,如果现在枚举的坐标在原矩形内,那么便可以加上这个面积。同时为了防止重复相加一个区块,加完以后应当跳出第三层循环。

程序:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long n,x1[101],y1[101],x2[101],y2[101],x[201],y[201];
long long i,j,k;
long long ass;
bool cmp(long long a,long long b)
{
    return a<b;
}
int main()
{
    scanf("%lld",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%lld%lld%lld%lld",&x1[i],&y1[i],&x2[i],&y2[i]);
        x[i*2-1]=x1[i];x[i*2]=x2[i];
        y[i*2-1]=y1[i];y[i*2]=y2[i];
    }
    sort(x+1,x+n*2+1,cmp);
    sort(y+1,y+n*2+1,cmp);
    for (i=1;i<=n*2-1;i++)
    for (j=1;j<=n*2-1;j++)
    for (k=1;k<=n;k++)
    if (x[i]>=x1[k]&&y[j]>=y1[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])
    {
        ass+=(x[i+1]-x[i])*(y[j+1]-y[j]);
        break;
    }
    printf("%lld",ass);
}