站外题求助
  • 板块学术版
  • 楼主Willan_Lian
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/8/18 20:31
  • 上次更新2023/11/3 02:49:09
查看原帖
站外题求助
223620
Willan_Lian楼主2023/8/18 20:31

题意:桌面上放了N个矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

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

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

70pts代码如下:

#include<bits/stdc++.h>
#pragma once
using namespace std;
long long n,X1[110],X2[110],Y1[110],Y2[110],cnt;
long long lshx[220],lshy[220],lenx,leny;
long long ans;

bool mp[220][220];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        //if(a-c<0 && b-d>0) continue;

        //else {
            cnt++;
            X1[cnt]=a,X2[cnt]=c;
            Y1[cnt]=b,Y2[cnt]=d;

            lshx[cnt]=X1[cnt],lshy[cnt]=Y1[cnt];
            lshx[cnt+n]=X2[cnt],lshy[cnt+n]=Y2[cnt];
        //}
    }

    sort(lshx+1,lshx+2*cnt+1);
    sort(lshy+1,lshy+2*cnt+1);

    lenx=unique(lshx+1,lshx+2*cnt+1)-lshx;
    leny=unique(lshy+1,lshy+2*cnt+1)-lshy;

    for(int i=1;i<=cnt;i++){
        X1[i]=lower_bound(lshx+1,lshx+lenx+1,X1[i])-lshx;
        X2[i]=lower_bound(lshx+1,lshx+lenx+1,X2[i])-lshx;
        Y1[i]=lower_bound(lshy+1,lshy+leny+1,Y1[i])-lshy;
        Y2[i]=lower_bound(lshy+1,lshy+leny+1,Y2[i])-lshy;
    }

    for(int i=1;i<=n;i++)
        for(int j=X1[i];j<X2[i];j++)
            for(int k=Y1[i];k<Y2[i];k++)
                mp[j][k]=1;

    for(int x=1;x<lenx;x++)
        for(int y=1;y<leny;y++)
            if(mp[x][y]) ans+=abs((lshx[x+1]-lshx[x])*(lshy[y+1]-lshy[y])); 

    printf("%lld",ans);
    return 0;
}
2023/8/18 20:31
加载中...