【hihocoder 1476】矩形计数

【题目链接】:http://hihocoder.com/problemset/problem/1476

【题意】

【题解】

首先不考虑黑格子,计算出一共有多少个矩形:
枚举矩形的大小r×c,这样大小的矩形一共有(N−r+1)(M−c+1)个。
然后减去不符合要求的矩形,也就是减去包含第一个黑格子的矩形个数,减去包含第二个黑格子,第三个的……
然后再加上包含第一第二黑格子的矩形数……
也就是容斥原理。
(奇数个黑色格子就减,偶数个就加)
每一项的具体值如下计算:对于这些不能包含的格子,统计最左最右最上最下的位置——4个坐标,不妨设为lx,rx,ly,ry,则至少包含这些格子的方案数为lx×ly×(n−rx+1)×(m−ry+1)。

【Number Of WA

1

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 15;

LL n,m,k,ans;
pll a[N];

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
    cin >> n >> m >> k;
    rep1(i,1,k)
        cin >> a[i].fi >> a[i].se;
    rep1(i,1,n)
        rep1(j,1,m)
            ans+=1LL*(n-i+1)*(m-j+1);
    rep1(i,1,(1<<k)-1)
    {
        int cnt = 0;
        LL lx,ly,rx,ry;
        rep1(j,0,k-1)
        {
            if ((i>>j)&1)
            {
                cnt++;
                if (cnt==1)
                {
                    lx = a[j+1].fi,ly = a[j+1].se;
                    rx = a[j+1].fi,ry = a[j+1].se;
                }
                else
                {
                    lx = min(lx,a[j+1].fi),ly = min(ly,a[j+1].se);
                    rx = max(rx,a[j+1].fi),ry = max(ry,a[j+1].se);
                }
            }
        }
        if (cnt&1)
            ans-=1LL*lx*ly*(n-rx+1)*(m-ry+1);
        else
            ans+=1LL*lx*ly*(n-rx+1)*(m-ry+1);
    }
    cout << ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626372.html