CCF-CSP 202303-1田地丈量

问题描述
西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标(x1, y1)和右上角坐标(x2,y2 )唯一确定,且满足x1<x2、y1<y2。这n 块田地中,任意两块的交集面积均为0,仅边界处可能有所重叠。最近,顿顿想要在南山脚下开垦出一块面积为axb矩形田地,其左下角坐标为(0,0)、右上角坐标为(a, b)。试计算顿顿选定区域内已经存在的田地面积。


输入格式
从标准输入读入数据。输入共n+1行。
输入的第一行包含空格分隔的三个正整数、n、a和b,分别表示西西艾弗岛上田地块数和顿顿选定区域的右上角坐标。接下来n行,每行包含空格分隔的四个整数x1、y1、x2和y2,表示一块田地的位置。


输出格式

输出到标准输出。

输出一个整数,表示顿顿选定区域内的田地面积。

样例输入

4 10 10
0 0 5 5
5 -2 15 3
8 8 15 15
-2 10 3 15

样例输出

44

样例解释

如图所示,选定区域内田地(绿色区域)面积为 44。

这道题如果要分类讨论将会非常麻烦,经过仔细观察,可以抽象出一个每种情况都满足的公式:

 S=(right-left)*(head-bottom),

其中 left=max(x1,0),right=min(x2,a);head=min(y2,b); bottom=max(y1,0);

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,n;
int res;
int main()
{
    int x1,x2,y1,y2;
    scanf("%d%d%d",&n,&a,&b);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        int left=max(x1,0);
        int right=min(x2,a);
        int head=min(y2,b);
        int bottom=max(y1,0);
        if(right-left>0&&head-bottom>0)
            res+=(right-left)*(head-bottom);
    }
    printf("%d",res);
    return 0;
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值