【集训Day3 离散化】矩形覆盖

矩形覆盖(planting)
【问题描述】
给定在一个平面坐标系上的N(1 <= N <= 100)个矩形区域,这N个矩形可能有相互覆盖的部分。求平面上被所有矩形覆盖的总面积,重复部分只算一次。
【输入格式】planting.in
第一行一个整数N。
接下来N行,每行包含4个整数x1 y1 x2 y2,表示一个矩形区域。矩形的左上角为(x1,y1),右下角为(x2,y2)。坐标范围为–10^8到10^8之间的整数。
【输出格式】planting.out
输出被矩形覆盖的总面积。
【输入样例】
2
0 5 4 1
2 4 6 2
【输出样例】
20

【解题思路】
将输入的行和列用两个数组映射到1···n中去,将其离散化,利用另一个数组存下每一对离散的变量之间的差距
【解题反思】

  • 解题时要注意细节

【参考程序】

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct data
{
    int num;
    int id;
}x[205],y[205];
bool comp(data a,data b)
{
    return a.num<b.num;
}
int n,bx[205],by[205],c[205][205],ans,pic[205][205];
int main()
{
    freopen("planting.in","r",stdin);
    freopen("planting.out","w",stdout);
    cin>>n;
    for (int i=1;i<=n;i++) 
    {
        cin>>x[2*i-1].num>>y[2*i].num>>x[2*i].num>>y[2*i-1].num;//由于是平面直角坐标系,列轴是向上的。 
        x[2*i-1].id=2*i-1;
        y[2*i-1].id=2*i-1;
        x[2*i].id=2*i;
        y[2*i].id=2*i;
    }
    sort(x+1,x+1+2*n,comp);
    sort(y+1,y+1+2*n,comp);
    for (int i=1;i<=2*n;i++) 
    {
        bx[x[i].id]=i;
        by[y[i].id]=i;
    }//离散化 
    for (int i=1;i<2*n;i++)
        for (int j=1;j<2*n;j++)
            c[i][j]=(x[i+1].num-x[i].num)*(y[j+1].num-y[j].num);//每一个离散的变量间的差距 
    for (int i=1;i<=n;i++)
        for (int j=bx[2*i-1];j<bx[2*i];j++)
            for (int k=by[2*i-1];k<by[2*i];k++) pic[j][k]=1;//传统的标记方法,简单暴力 
    for (int i=1;i<2*n;i++)
        for (int j=1;j<2*n;j++)
            if (pic[i][j]==1) ans+=c[i][j];//统计 
    cout<<ans;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值