Link:

Codeforces #192 传送门

 

前两天由于食物中毒现在还要每天挂一天的水

只好晚上回来随便找套题做做找找感觉了o(╯□╰)o

A:

看到直接大力模拟了

但有一个更简便的方法,复杂度为$O(被禁止的格子数)$

 

如果将每个黑格子上下左右四条线都染上色

可以发现一个格子最终无法被“净化”当且仅当其被左右/上下来向都染过色,所以将最终无法净化的格子合并是一个矩形

这样最终答案为:黑格子出现的行的个数*黑格子出现的列的个数

 

此时复杂度就变成与黑格子个数相关了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
int n,m,cnt,vis[20][20];char dat[20][20];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%s",dat[i]+1);
    for(int i=1;i<=n;i++)
    {
        bool f=0;
        for(int j=1;j<=m;j++)
            if(dat[i][j]=='S'){f=1;break;}
        if(f) continue;
        for(int j=1;j<=m;j++) vis[i][j]=1;
    }
    for(int i=1;i<=m;i++)
    {
        bool f=0;
        for(int j=1;j<=n;j++)
            if(dat[j][i]=='S'){f=1;break;}
        if(f) continue;
        for(int j=1;j<=n;j++) vis[j][i]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cnt+=vis[i][j];
    printf("%d",cnt);
    return 0;
}
Problem A

相关文章: