Submission #163184

#TimeUsernameProblemLanguageResultExecution timeMemory
163184TadijaSebezSandwich (JOI16_sandwich)C++11
0 / 100
6 ms636 KiB
#include <bits/stdc++.h>
using namespace std;
const int N=405;
const int inf=1e9+7;
char mat[N][N],tmp1[N][N];
int n,m,id[N][N],tmp2[N][N],ans[N*N];
void rot()
{
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	{
		tmp1[m-j+1][i]=mat[i][j];
		tmp2[m-j+1][i]=id[i][j];
	}
	swap(n,m);
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	{
		mat[i][j]=tmp1[i][j];
		if(mat[i][j]=='N') mat[i][j]='Z';
		else mat[i][j]='N';
		id[i][j]=tmp2[i][j];
	}
}
bool dp[N][N];
int NS[N][N];
int Get(int xl, int xr, int yl, int yr){ return NS[xr][yr]-NS[xl-1][yr]-NS[xr][yl-1]+NS[xl-1][yl-1];}
void Solve()
{
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) NS[i][j]=NS[i-1][j]+NS[i][j-1]-NS[i-1][j-1]+(mat[i][j]=='N');
	dp[1][1]=1;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(i!=1 || j!=1)
	{
		dp[i][j]=0;
		if(i!=1 && dp[i-1][j])
		{
			int L=j-1,R=m+1;
			while(L<m && mat[i-1][L+1]=='Z') L++;
			while(R>j && mat[i-1][R-1]=='N') R--;
			if(L+1==R) dp[i][j]=1;
		}
		if(j!=1 && dp[i][j-1])
		{
			int L=i-1,R=n+1;
			while(L<n && mat[L+1][j-1]=='Z') L++;
			while(R>i && mat[R-1][j-1]=='N') R--;
			if(L+1==R) dp[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	{
		for(int k=j;k>=1;k--)
		{
			int bot=1,top=i,mid,sol=-1;
			while(top>=bot)
			{
				mid=top+bot>>1;
				if(Get(mid,i,k,j)==0) sol=mid,top=mid-1;
				else bot=mid+1;
			}
			if(sol!=-1 && dp[sol][k]) ans[id[i][j]]=min(ans[id[i][j]],(j-k+1)*(i-sol+1)+n*(k-1)+m*(sol-1)-(k-1)*(sol-1));
		}
	}
}
int main()
{
	scanf("%i %i",&n,&m);
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) id[i][j]=(i-1)*m+j;
	for(int i=1;i<=n*m;i++) ans[i]=inf;
	for(int i=1;i<=n;i++) scanf("%s",mat[i]+1);
	for(int i=1;i<=4;i++) Solve(),rot();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(ans[(i-1)*m+j]==inf) printf("-1 ");
			else printf("%i ",ans[(i-1)*m+j]*2);
		}
		printf("\n");
	}
	return 0;
}

Compilation message (stderr)

sandwich.cpp: In function 'void Solve()':
sandwich.cpp:55:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     mid=top+bot>>1;
         ~~~^~~~
sandwich.cpp: In function 'int main()':
sandwich.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
sandwich.cpp:68:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=n;i++) scanf("%s",mat[i]+1);
                        ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...