记录编号 175670 评测结果 AAAAAAAAAA
题目名称 [NOI 2005]瑰丽华尔兹 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 1.684 s
提交时间 2015-08-06 17:39:24 内存使用 28.53 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define MAX(a,b) ((a)>(b)?(a):(b))

using namespace std;

int n,m,t1,t2,t,head,tail,q[210],lenth[210];
int f[210][210][210],tt[210];
int ans=0;
char c[210][210];

void DP1(int x)
{
	
	for(int i=1;i<=m;i++)
	{
		head=1;tail=0;
		for(int j=n;j>=1;j--)
		{
			if(c[j][i-1]=='x'){ head=1,tail=0;continue;}
			while(head<=tail&&q[head]-lenth[x]>j)	head++;
			while(head<=tail&&f[x-1][q[tail]][i]+q[tail]-j<f[x-1][j][i])	tail--;
			q[++tail] = j;
			f[x][j][i]=MAX(f[x-1][q[head]][i]+q[head]-j,f[x][j][i]);
			ans=MAX(f[x][j][i],ans);
		}
	}
}
void DP2(int x)
{
	
	for(int i=1;i<=m;i++)
	{
		head=1;tail=0;
		for(int j=1;j<=n;j++)
		{
			if(c[j][i-1]=='x'){ head=1,tail=0;continue;}
			while(head<=tail&&q[head]+lenth[x]<j)	head++;
			while(head<=tail&&f[x-1][q[tail]][i]+j-q[tail]<f[x-1][j][i])	tail--;
			q[++tail] = j;
			f[x][j][i]=MAX(f[x-1][q[head]][i]+j-q[head],f[x][j][i]);
			ans=MAX(f[x][j][i],ans);
		}
	}
}
void DP3(int x)
{
	
	for(int i=1;i<=n;i++)
	{
		head=1;tail=0;
		for(int j=m;j>=1;j--)
		{
			if(c[i][j-1]=='x'){ head=1,tail=0;continue;}
			while(head<=tail&&q[head]-lenth[x]>j)	head++;
			while(head<=tail&&f[x-1][i][q[tail]]+q[tail]-j<f[x-1][i][j])	tail--;
			q[++tail] = j;
			f[x][i][j]=MAX(f[x-1][i][q[head]]+q[head]-j,f[x][i][j]);
			ans=MAX(f[x][i][j],ans);
		}
	}
}
void DP4(int x)
{
	
	for(int i=1;i<=n;i++)
	{
		head=1;tail=0;
		for(int j=1;j<=m;j++)
		{
			if(c[i][j-1]=='x'){ head=1,tail=0;continue;}
			while(head<=tail&&q[head]+lenth[x]<j)	head++;
			while(head<=tail&&f[x-1][i][q[tail]]+j-q[tail]<f[x-1][i][j])	tail--;
			q[++tail] = j;
			f[x][i][j]=MAX(f[x-1][i][q[head]]+j-q[head],f[x][i][j]);
			ans=MAX(f[x][i][j],ans);
		}
	}
}

int main()
{
    freopen("adv1900.in","r",stdin);
    freopen("adv1900.out","w",stdout);
	memset(f,-0x3f,sizeof(f));
	scanf("%d%d%d%d%d",&n,&m,&t1,&t2,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",c[i]);
	}
	for(int i=1;i<=t;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		lenth[i]=y-x+1;
		scanf("%d",&tt[i]);
	}
	f[0][t1][t2]=0;
	for(int i=1;i<=t;i++)
	{
		if(tt[i]==1)	DP1(i);
		if(tt[i]==2)	DP2(i);
		if(tt[i]==3)	DP3(i);
		if(tt[i]==4)	DP4(i);
	}
	/*for(int i=1;i<=t;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=m;k++)
			{
				if(f[i][j][k]<0)
					printf("%d ",0);
				else
					printf("%d ",f[i][j][k]);
			}
			printf("\n");
		}
		printf("\n");
	}*/
	printf("%d",ans);
}