离散化

题目:https://vijos.org/p/1056


描述

桌面上放了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

样例输出1[复制]

10



离散化图形,然后暴力找符合条件的矩形,这不就是看着n=100么,等于10000就要跪。不过我还是掌握线段树做这道题!现在姿势还不够啊!先晾在这里,过段时间多!



#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
using namespace std;
__int64 x[220],y[220],x1[110],yy[110],x2[110],y2[110];
__int64 a,b,c,d;
int n;
int main()
{
    cin.sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b>>c>>d;
        x[i*2-1]=a;
        x[i*2]=c;
        y[i*2-1]=b;
        y[i*2]=d;
        x1[i]=a;
        yy[i]=b;
        x2[i]=c;
        y2[i]=d;
    }
    sort(x+1,x+2*n+1);
    sort(y+1,y+2*n+1);
    __int64 ans=0,s=0;
    for(int i=1;i<=2*n-1;i++)
    {
        for(int j=1;j<=2*n-1;j++)
        {
            s=(x[i+1]-x[i])*(y[j+1]-y[j]);
            for(int k=1;k<=n;k++)
            {
                if(x[i]>=x1[k] && y[j]>=yy[k] && x[i+1]<=x2[k] && y[j+1]<=y2[k])
                {
                    ans+=s;
                    break;
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}


你可能感兴趣的:(离散化)