记录编号 24875 评测结果 AAAAAAAAAA
题目名称 剪切矩形 最终得分 100
用户昵称 GravatarPom 是否通过 通过
代码语言 C++ 运行时间 0.965 s
提交时间 2011-05-19 09:02:59 内存使用 0.27 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN=1005;

int f[MAXN],d[MAXN],i,j,k,h,t,Q[MAXN],tmp,cot,n,m,MIN;
char ch;
long long ans;

void cal()
{
	int k;
	if (Q[t]<Q[t-1])
	{
		for (k=t-1;Q[k-1]==Q[t-1];) k--;
		MIN=Q[t-1]-Q[t];
		if (Q[k-1]<Q[k]) MIN=min(Q[k]-Q[k-1],MIN);
		ans+=MIN*(t-k)*(t-k+1)/2;
		if (Q[k-1]<Q[t])
		{
			for (int x=k;x<t;x++) Q[x]=Q[t];
			swap(t,k);
			cal();
			swap(t,k);
		}
		else
		{
			for (int x=k;x<t;x++) Q[x]=Q[k-1];
			cal();
		}
	}
}

int main()
{
	freopen("rectangle.in","r",stdin);
	freopen("rectangle.out","w",stdout);
	scanf("%d%d",&n,&m);
	Q[0]=0;
	for (i=1;i<=n;i++)
	{
		t=0;
		for (j=1;j<=m;j++)
		{
			scanf("%c",&ch);
			while (ch!='.' && ch!='*') scanf("%c",&ch);
			if (ch=='*') f[j]=0;
			else ++f[j];
			Q[++t]=f[j];
			cal();
		}
		Q[++t]=0;
		cal();
	}
	cout<<ans<<endl;
	return 0;
}