• codeforces 611C


    题意:
    给你一个矩阵,矩阵里有” . “和” # “,” . “表示空的,” # “表示禁止的。
    多米诺骨牌将占据正好有两个相邻的单元格,或者位于一排或一列。两个相邻的单元格必须是空的,并且必须是一个网格内。对于每个询问,求给定矩形里面能组成不同多米诺骨牌的方式。
    思路:
    对于一段连续空的,我们能算出来,他的方法是n-1个。
    =>求给定矩阵在行和列上的连续空的有多长。
    一个挺好的方案:开两个数组直接记录,然后对于给定矩形,枚举每行每列,直接减一下,全部加起来就是answer。
    感觉有点小神奇的方法。。。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double eps=1e-6;
    const double pi=acos(-1.0);
    const int mod=998244353;
    const int INF=0x3f3f3f3f;
    
    const int N=1e2+10;
    
    char ma[N*5][N*5];
    int n[N*5][N*5];
    int m[N*5][N*5];
    
    int main()
    {
        int i,j,h,w;
        scanf("%d%d",&h,&w);
        for(i=0;i<h;i++)
            scanf("%s",ma[i]);
        memset(n,0,sizeof(n));
        memset(m,0,sizeof(m));
    
        for(i=0;i<h;i++)
        {
            for(j=0;j<w;j++){
                if(j>0&&ma[i][j]=='.'&&ma[i][j]==ma[i][j-1]) n[i][j]=n[i][j-1]+1;
                else n[i][j]=n[i][j-1];
                if(i>0&&ma[i][j]=='.'&&ma[i-1][j]==ma[i][j]) m[i][j]=m[i-1][j]+1;
                else m[i][j]=m[i-1][j];
            }
        }
        LL ans;
        int q;
        int x1,x2,y1,y2;
        scanf("%d",&q);
        while(q--){
            ans=0;
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            x1--;
            y1--;
            x2--;
            y2--;
            for(i=x1;i<=x2;i++)
                ans+=n[i][y2]-n[i][y1];
            for(j=y1;j<=y2;j++)
                ans+=m[x2][j]-m[x1][j];
            printf("%I64d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    hibernate入门
    struts文件上传
    Struts的增删改查
    struts入门
    Maven配置以及环境搭配
    layui增删改查
    easyui三
    A
    C. Permutation Cycle
    E
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934414.html
Copyright © 2020-2023  润新知