[CF738B]Spotlights(前缀和,模拟)

题目链接:http://codeforces.com/contest/738/problem/B

题意:问多少个0的方向,使得方向上至少有一个1。

四个方向统计一遍前缀和,向上向左正着记,向下向右倒着记。判断某0点是不是大于等于1。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 1010;
 5 int G[maxn][maxn];
 6 int dp[5][maxn][maxn];
 7 int n, m;
 8 int ret;
 9 
10 int main() {
11     // freopen("in", "r", stdin);
12     while(~scanf("%d%d",&n,&m)) {
13         for(int i = 1; i <= n; i++) {
14             for(int j = 1; j <= m; j++) {
15                 scanf("%d", &G[i][j]);
16             }
17         }
18         ret = 0;
19         for(int i = 1; i <= n; i++) {
20             for(int j = 1; j <= m; j++) {
21                 dp[0][i][j] = G[i][j] + dp[0][i][j-1];
22                 dp[1][i][j] = G[i][j] + dp[1][i-1][j];
23             }
24         }
25 
26         for(int i = n; i >= 1; i--) {
27             for(int j = m; j >= 1; j--) {
28                 dp[2][i][j] = G[i][j] + dp[2][i][j+1];
29                 dp[3][i][j] = G[i][j] + dp[3][i+1][j];
30             }
31         }
32 
33         for(int i = 1; i <= n; i++) {
34             for(int j = 1; j <= m; j++) {
35                 if(G[i][j] == 0) {
36                     for(int k = 0; k <= 3; k++) {
37                         if(dp[k][i][j] != 0) ret++;
38                     }
39                 }
40             }
41         }
42         printf("%d
", ret);
43     }        
44     return 0;
45 }
原文地址:https://www.cnblogs.com/kirai/p/6083410.html