#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;
}
这段不完整的代码跑了近1s的时间
但是如果在
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];
}
}
之前加上return 就只用100ms
求助为什么n,m都是3000,且h[i][j]和sum均不超过m,n,f数组两维都是3010的情况下这几行代码跑了800ms
代码的意思是一个01矩阵,上面那段在用单调栈求每个位置为中心,1的最长范围,即h[i][j],下面应该很好懂