#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[3005][3005],s[3005][3005];
int stc[3005],sn[3005],top;
long long sum,ans;
void init()
{
top=0;
sum=0;
memset(sn,0,sizeof(sn));
memset(stc,0,sizeof(stc));
}
int solve(int x,int y)
{
int i;
init();
int lx=y;
while(lx>0&&a[x][lx]!=0) lx--;
lx++;
for(i=lx;i<=y;i++)
{
int tmp=s[x][i];
while(tmp<stc[top])
{
top--;
}
if(tmp==stc[top])
{
continue;
}
top++;
stc[top]=tmp;
sn[top]=i;
}
int fx;
top=1;
for(i=lx;i<=y;i++)
{
if(i==sn[top])
{
fx=stc[top];
top++;
}
sum+=fx;
}
return sum;
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]==1)
{
s[i][j]=s[i-1][j]+1;
}
else
{
s[i][j]=0;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]==0)
{
continue;
}
// cout<<ans<<" ";
ans+=solve(i,j);
}
}
cout<<endl;
cout<<ans;
return 0;
}
以上是我的代码,可以看到有一行调试代码是被注释的
当调试输出在的时候,ans输出25;不在的时候,输出为28
灵异事件?求助