暴力
枚举底边
预处理左右延伸长度
注意标号
蒟蒻我分不清l,r
#include <cstdio>
const int MAXN=1011;
int N;
int Map[3][MAXN][MAXN];
int Cnt[3][2][MAXN][MAXN];
int main(){
scanf("%d", &N);
for(int i=1;i<=N;++i){
for(int j=1, a, b, c;j<=i;++j){
scanf("%d%d%d", &a, &b, &c);
Map[0][i][j]=c;
Map[2][N-j+1][i-j+1]=a;
Map[1][N-i+j][N-i+1]=b;
}
}
for(int k=0, c;k<3;++k){
for(int i=1;i<=N;++i){
c=0;
for(int j=1;j<=i;++j){
if(!Map[k][i][j]) c=0;
else ++c;
Cnt[k][0][i][j]=c;
}
}
}
for(int k=0, c;k<3;++k){
for(int i=1;i<=N;++i){
c=0;
for(int j=i;j>=1;--j){
if(!Map[k][i][j]) c=0;
else ++c;
Cnt[k][1][i][j]=c;
}
}
}
/*
for(int k=0;k<3;++k){
for(int i=1;i<=N;++i){
for(int j=1;j<=i;++j){
printf("%d ", Cnt[k][1][i][j]);
}
puts("");
}
puts("");
}
*/
long long ANS=0LL;
for(int i=1, d;i<=N;++i){
for(int l=0;l<i;++l){
for(int r=l+1;r<=i;++r){
d=r-l;
if(Cnt[0][0][i][r]<d) continue;
if(Cnt[1][1][N-i+r][N-i+1]>=d && Cnt[2][0][N-l][i-l]>=d){
ANS+=1LL;
//printf("%d %d %d u
", i, l, r);
}
if(Cnt[2][1][N-r][i-r+1]>=d && Cnt[1][0][N-i+l][N-i]>=d){
ANS+=1LL;
//printf("%d %d %d d
", i, l, r);
}
}
}
}
printf("%lld
", ANS);
return 0;
}
/*
5
1 1 1
1 1 0 1 1 0
1 1 1 1 1 1 1 0 1
1 0 1 1 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1 1 0 1 1
19
*/