hiho 1476 - 矩形计数 容斥

Posted redips

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hiho 1476 - 矩形计数 容斥相关的知识,希望对你有一定的参考价值。

题目链接

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

技术分享图片

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

----------------------------------------------------------------------------------------------------

思路:

完全白色矩形数目 = 总个数 - 包含黑块的矩形数目。

包含黑块的矩形数目 = 包含一个黑块 - 包含两个黑块 + 包含三个黑块……

#include <cstdio>
#include <cstring>
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
#define OO 11111
int coords[1111][2];
int main(){
    long long m,n;
    int left,right,top,bottom;
    int k,cnt,curs;
    while(scanf("%lld%lld%d",&n,&m,&k)!=EOF){
        for(int i=0;i<k;i++) scanf("%d %d",&coords[i][0],&coords[i][1]);
        long long ret = n*(n+1)/2*m*(m+1)/2;
        for(int s=1;s<(1<<k);s++) {
             curs=s; cnt=0;
             left=top=OO;
             right=bottom=-OO;
             for(int i=0;i<k;i++){
                 if(curs&1){
                    cnt++;
                    left=MIN(left,coords[i][1]);
                    right=MAX(right,coords[i][1]);
                    top=MIN(top,coords[i][0]);
                    bottom=MAX(bottom,coords[i][0]);    
                }
                curs>>=1;
             }
             int sgn=(cnt%2)?(-1):1;
             ret += sgn*left*top*(n+1-bottom)*(m+1-right);
        }
        printf("%lld\n",ret);
    }
    return 0;
}

 

以上是关于hiho 1476 - 矩形计数 容斥的主要内容,如果未能解决你的问题,请参考以下文章

fzu 1476 矩形个数

No 1每天两道简单算法题目 —— 磨磨脑子1476. 子矩形查询

算法学习1476. 子矩形查询(java / c / c++ / python / go / rust)

hihoCoder 第253周 hiho一下 矩形分割

hiho1249 Xiongnu's Land

Project Euler 453 Lattice Quadrilaterals 困难的计数问题