这场cf前三题都非常的简单,不过C的有个hack点,其实就是考虑只帮一个人占座的情况,如果我们直接按前缀和判断可占座的情况,会使得最后的sum变为实际sum的两倍。考虑到这一点这题就算过去了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
#define pi acos(-1.0)
char s[2005][2005];
int n,m,k;
int a[2005][2005];
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>n>>m>>k;
for(int i=0;i<n;i++)
cin>>s[i];
ll cnt=0;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='*')
a[i][j]=0;
else if(s[i][j]=='.')
{
a[i][j]++;
if(j>=1)
a[i][j]+=a[i][j-1];
if(a[i][j]>=k)
cnt++;
}
}
}
//cout<<cnt<<endl;
memset(a,0,sizeof(a));
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++)
{
if(s[i][j]=='*')
a[i][j]=0;
else if(s[i][j]=='.')
{
a[i][j]++;
if(i>=1)
a[i][j]+=a[i-1][j];
//cout<<a[i][j]<<endl;
if(a[i][j]>=k)
cnt++;
}
}
}
if(k==1)
{
cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='.')
cnt++;
}
}
}
//cout<<a[0][0]<<endl;
cout<<cnt<<endl;
}