zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    垂直的SeekBar:VerticalSeekBar
    android 获取路径目录方法以及判断目录是否存在,创建目录
    JSON
    列表和导航
    【前端积累】链接
    【前端积累】背景图像和背景替换
    【前段积累】可视化模型
    【前端积累】选择器
    银联支付-产品测试sdk使用流程
    【CSS系列】块级元素和行内元素
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626372.html
Copyright © 2011-2022 走看看