楠楠的学校有B个男生和G个女生都来到一个巨大的操场上,操场可以看成是N行M列的方格矩阵,如下图(1)是一个4行5列的方格矩阵。每个男生负责打扫一些连续的行,每个女生负责打扫一些连续的列。比如有两个男生,第一个男生负责第1、2两行、第二个男生负责第4行,如图(2)的蓝色。打扫的区域可能重复,比如,又有两个女生,第一个女生负责打扫第3、4两列,第二个女生负责打扫第4、5两列,如图(3)的红色。从图(3)可以容易看出,有颜色覆盖的方格数为18,即这4名学生总共打扫了18个方格。
老师要楠楠在学校给出打扫安排的数据后快速计算出这些学生总共打扫了多少方格?

输入

第一行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。

输出

一个整数,表示所打扫的面积。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[5000],c[5000];
int e[5000][5000]={0};
int main()
{
	int n,m,b,g,i,j,k;
	int sum=0;
	scanf(\"%d%d%d%d\",&n,&m,&b,&g);
	for(i=1;i<=b;i++)
	{
		scanf(\"%d%d\",&a[i],&c[i]);
		for(j=a[i];j<=c[i];j++)
		{
			e[j][3]=1;
		}
	}
	for(i=1;i<=g;i++)
	{
		scanf(\"%d%d\",&a[i],&c[i]);
		for(j=a[i];j<=c[i];j++)
		{
			e[0][j]=2;	
		}
    } 
    int count1=0,count2=0;
    for(i=0;i<=n;i++)
    for(j=0;j<=m;j++)
    {
    	if(e[i][j]==1)
    	{
    		sum+=m;
    		count1++;
		}
    
    	if(e[i][j]==2)
    	{
    		sum+=n;
    		count2++;
		}
	}
	printf(\"%d\\n\",sum-count1*count2);
	return 0;
}
收藏 打印