覆盖
题目背景
WSR的学校有B个男生和G个女生都来到一个巨大的操场上扫地。
题目描述
操场可以看成是N 行M 列的方格矩阵,如下图(1)是一个4 行5 列的方格矩阵。每个男生负责打扫一些连续的行,每个女生负责打扫一些连续的列。比如有两个男生,第一个男生负责第1、2 两行、第二个男生负责第4 行,如图(2)的蓝色。打扫的区域可能重复,比如,又有两个女生,第一个女生负责打扫第3、4 两列,第二个女生负责打扫第4、5 两列,如图(3)的红色。从图(3)可以容易看出,有颜色覆盖的方格数为18,即这4 名学生总共打扫了18 个方格。
老师要WSR在学校给出打扫安排的数据后快速计算出这些学生总共打扫了多少方格?
输入格式
第一行4 个正整数:N,M,B,G,N 表示方阵行数,M 表示方阵列数,B 表示男生数,G 表示女生数。
接下来B 行,每行两个整数x y。表示相应某个男生负责打扫从第x 行到第y行(共y-x+1 行),保证1≤x≤y≤N。
再接下来G 行,每行两个整数x y。表示相应某个女生负责打扫从第x 列到第y 列(共y-x+1 列),保证1≤x≤y≤M。
输出格式
一个整数,表示所打扫的面积。(即格子的总数)
样例 #1
样例输入 #1
4 5 2 2
1 2
4 4
3 4
4 5
样例输出 #1
18
提示
不会可以自己画图。
数据范围:
8 个的数据:N,M,B,G 的范围都是[1…100]
2 个的数据:N,M,B,G 的范围都是[1…5,000]
分析:
因为我们是先输入男生扫地的区域的,所以我们可以先把男生扫地的总面积先加进ans中,在加女生的扫地总面积就行了。
男生面积计算:
- 定义一个A数组,用来判断当前这一行是否已经被打扫了。
- 如果当前这一行还没被打扫过,ans+=m。
女生面积计算:
- 因为某些区域已经被男生给扫了,所以我们只需加当前这一列中没有被男生扫过的方格。
- 计算方格:
如图,我们不难看看出,女生真正打扫的方格只有3个。而这3个方格正好是位于之前男生没有打扫到的那一行。所以女生一列所打扫的方格数等于男生未打扫的行数。 - 之后我们还是定义一个B数组,用来判断当前这一列是否已经被打扫了。
- 如果当前这一列还没被打扫过,ans+=n。(这里的n表示没有被男生打扫过的行数)
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int b,g;
int A[10000],B[10000];
int k;
int ans;
int main()
{
cin>>n>>m>>b>>g;
for(int i=1;i<=b;i++)
{
int x,y;
cin>>x>>y;
k=0;//k表示被重复打扫的行数
for(int j=x;j<=y;j++)//从x行枚举至y行
{
if(A[j]==0)//没有被打扫
{
ans+=m;
A[j]=1;//标记
}
else//已经被打扫
{
k++;//重复了
}
}
n=n-(y-x+1-k);//每次剩下的行数等于当前剩余行数减去当前被打扫行数再加上被重复打扫的行数
}
for(int i=1;i<=g;i++)//女生
{
int x,y;
cin>>x>>y;
for(int j=x;j<=y;j++)//从第x列枚举至y列
{
if(B[j]==0)//没被打扫
{
ans+=n;
B[j]=1;//标记
}
}
}
cout<<ans;//输出
return 0;
}
结束啦~~~