BZOJ 1201 数三角形

暴力
枚举底边
预处理左右延伸长度
注意标号
蒟蒻我分不清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\n", 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\n", i, l, r);
				}
			}
		}
	}
	
	printf("%lld\n", 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

*/
posted @ 2018-06-09 10:34  Pickupwin  阅读(122)  评论(0编辑  收藏  举报