首页 > 学院 > 开发设计 > 正文

#1476 : 矩形计数

2019-11-06 07:10:54
字体:
来源:转载
供稿:网友
时间限制:10000ms单点时限:1000ms内存限制:256MB

描述

如图所示,在由N行M列个单位正方形组成的矩形中,有K个单位正方形是黑色的,其余单位正方形是白色的。  

你能统计出一共有多少个不同的子矩形是完全由白色单位正方形组成的吗?

输入

第一行三个整数:N, M和K。

之后K行每行包括两个整数R和C,代表一个黑色单位正方形的位置。

1 <= N,M <= 1000  

1 <= K <= 10  

1 <= R <= N  

1 <= C <= M

输出

输出一个整数表示满足条件的子矩形个数。

样例输入
3 3 12 3 样例输出
24
#include <cstdio>#include <iostream>using namespace std;int main(){	freopen( "/home/liyuanshuo/ClionPRoject/hihocoder8/in.in", "r", stdin);	long long ans;	int n, m, k;	int a[12][2];	while( scanf("%d%d%d", &n, &m, &k) != EOF )	{		for(int i = 0; i < k; i++)		{			scanf("%d%d", &a[i][0], &a[i][1]);			a[i][0]--, a[i][1]--;		}		ans = 0;		for(int i = 0; i < n; i++)		{			for(int j = 0; j < m; j++)			{				ans += (n - i) * (m - j);			}		}				for(int code = 1; code < (1 << k); code++)		{			int l = m, r = 0, u = n, d = 0, cnt = 0;			for(int i = 0; i < k; i++)			{				if( (code & (1 << i)) != 0 )				{					l = min(l, a[i][0]), u = min(u, a[i][1]);					r = max(r, a[i][0] + 1), d = max(d, a[i][1] + 1);					cnt++;				}			}			if(cnt % 2 == 0)				ans += ((long long)(l + 1)) * (u + 1) * (m - r + 1) * (n - d + 1);			else				ans -= ((long long)(l + 1)) * (u + 1) * (m - r + 1) * (n - d + 1);		}		cout << ans << endl;	}	return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表