问题描述
西西艾弗岛上散落着 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;
}