vijos1056 8.27xiaolver快没时间了

题目链接:https://www.vijos.org/p/1056

简单题,做了之后并没有对离散化有很多认识(本来是想认识一下离散化的)

输入n组数据   每组都是矩形的左下点和右上点.

求这些矩形覆盖的面积,由于坐标范围太大开不了就先用数组存坐标.

把覆盖的地方按蓝线黑线分割.覆盖面积就是每两个最相近x和两个相近y组成的矩形.将输入的x,y都存起来排序,枚举每两个最近x,y当他们组成的小矩形是某个矩形的部分就加入S.这........哪里是离散化..呜呜,贴个代码

#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define xh(i,m,n) for(int i=m;i<=n;i++)
#define ll long long
#define se(w) scanf("%lf",&w)
#define ss(o) scanf("%s",o)
#define sd(q) scanf("%d",&q)
#define init(qwe) memset(qwe,0,sizeof(qwe));
#define finit(qwe) memset(qwe,-1,sizeof(qwe));
#define INF 0x3f3f3f3f
#define maxn 500005
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define MAXN 100005
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define gc getchar()
int n;
ll x1[205],yo[205],x2[205],y2[205],x[410],y[410],S,ans;
using namespace std;
int main()
{
    sd(n);
    xh(i,1,n)
    {
        scanf("%lld%lld%lld%lld",&x1[i],&yo[i],&x2[i],&y2[i]);
        x[2*i-1]=x1[i];
        x[2*i]=x2[i];
        y[2*i-1]=yo[i];
        y[2*i]=y2[i];
    }
    sort(x+1,x+2*n+1);
    sort(y+1,y+2*n+1);
    xh(i,1,2*n-1)
    xh(j,1,2*n-1){
        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]>=yo[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])
                { ans+=S; break; }
    }printf("%lld",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_35557621/article/details/82118084