离散化

来源:互联网 发布:证券行业 知乎 编辑:程序博客网 时间:2024/04/29 06:24

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


描述

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

格式

输入格式

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

输出格式

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

样例1

样例输入1[复制]

31 1 4 32 -1 3 24 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 0x3f3f3f3fusing 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;}


0 0