萌新求助关于常数的问题
查看原帖
萌新求助关于常数的问题
135950
this_red_is_gone楼主2020/6/18 17:29
#include<bits/stdc++.h>
using namespace std;
namespace red{
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid ((l+r)>>1)
#define lowbit(i) ((i)&(-i))
	inline int read()
	{
		int x=0;char ch,f=1;
		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
		if(ch=='-') f=0,ch=getchar();
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
		return f?x:-x;
	}
	const int N=3010;
	int n,m;
	long long ret;
	int a,b,c,d;
	char s[N][N];
	int tl[N],tr[N],st[N],top;
	int h[N][N],f[N][N];
	inline void main()
	{
		n=read(),m=read();
		a=read(),b=read(),c=read(),d=read();
		a=max(a,3),b=max(b,2);
		for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j) tl[j]=tr[j]=0;
			top=0;
			for(int j=1;j<=m;++j)
			{
				if(s[i][j]=='0')
				{
					while(top) tr[st[top--]]=j;
					tr[j]=j;
				}
				else st[++top]=j;
			}
			while(top) tr[st[top--]]=m+1;
			for(int j=m;j;--j)
			{
				if(s[i][j]=='0')
				{
					while(top) tl[st[top--]]=j;
					tl[j]=j;
				}
				else st[++top]=j;
			}
			for(int j=1;j<=m;++j)
			{
				if(s[i][j]=='1') h[i][j]=min(tr[j]-j-1,j-tl[j]-1)*2+1;
			}
		}
		//return;
		for(int sum,j=1;j<=m;++j)
		{
			sum=0;
			for(int i=n;i;--i)
			{
				if(s[i][j]=='0') sum=0;
				else ++sum;
				if(s[i][j]=='1') ++f[h[i][j]][sum];
			}
		}
	}
}
signed main()
{
	red::main();
	return 0;
}

这段不完整的代码跑了近1s1s的时间

但是如果在

for(int sum,j=1;j<=m;++j)
		{
			sum=0;
			for(int i=n;i;--i)
			{
				if(s[i][j]=='0') sum=0;
				else ++sum;
				if(s[i][j]=='1') ++f[h[i][j]][sum];
			}
		}

之前加上returnreturn 就只用100ms100ms

求助为什么n,mn,m都是30003000,且h[i][j]h[i][j]sumsum均不超过m,nm,nff数组两维都是30103010的情况下这几行代码跑了800ms800ms

代码的意思是一个01矩阵01矩阵,上面那段在用单调栈求每个位置为中心,11的最长范围,即h[i][j]h[i][j],下面应该很好懂

2020/6/18 17:29
加载中...