The writing on the wall (暴力列舉)
阿新 • • 發佈:2018-12-09
題意:
有一個含有n*m個方格的矩陣,其中有幾格塗黑了,求不包含黑方塊的子矩陣個數。
列舉每個點作為左上角的貢獻即可,這個可以先預處理每個點最下面能到達的位置(或者最上面,看自己喜歡),然後從左到右遍歷一遍就能得到那個點作為左上角的子矩陣個數,求和即為答案。
效率是O(n*m*m)
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 1e5 + 10; int T, n, m, k, x, y, cas; int a[N][111], d[N][111]; int main() { scanf("%d", &T); while(T--) { memset(a, 0, sizeof a); scanf("%d%d%d", &n, &m, &k); for(int i=1;i<=k;i++) { scanf("%d%d", &x, &y); a[x][y] = 1; } for(int j=1;j<=m;j++) { d[n+1][j] = n+1; for(int i=n;i>=1;i--) { if(a[i][j]) d[i][j] = i; else d[i][j] = d[i+1][j]; } } long long ans = 0; for(int i=1;i<=n;i++) { a[i][m+1] = 1; for(int j=1;j<=m;j++) { if(a[i][j]) continue; int mi = d[i][j] - i; for(int k=j;!a[i][k];k++) { mi = min(mi, d[i][k] - i); ans = ans + mi; } } } printf("Case #%d: %lld\n", ++cas, ans); } return 0; }