fork download
  1. /* paiza POH! vol.2
  2.  * result:
  3.  * http://p...content-available-to-author-only...a.jp/poh/paizen/result/9ff3312da163b66180c9e5c7e39766de
  4.  * author: Leonardone @ NEETSDKASU
  5.  */
  6. import java.util.*;
  7. import java.lang.*;
  8. import java.io.*;
  9.  
  10. class Main
  11. {
  12. public static void main (String[] args) throws java.lang.Exception
  13. {
  14.  
  15. String[] hw = in.readLine().split(" ");
  16. final int H = Integer.parseInt(hw[0]);
  17. final int W = Integer.parseInt(hw[1]);
  18.  
  19. int[][] space2left = new int[H][W];
  20. int[][] space2top = new int[H][W];
  21. int allSpaceCount = 0;
  22.  
  23. int[] startPointX = new int[H * (1 + W / 3)];
  24. int[] startPointY = new int[H * (1 + W / 3)];
  25. int startPointCount = 0;
  26.  
  27. int[] space2leftCount = new int[W + 1];
  28. int[] space2topCount = new int[H + 1];
  29.  
  30. for (int y = 0; y < H; y++)
  31. {
  32. String line = in.readLine();
  33. int spaceCount = 0;
  34. for (int x = 0; x < W; x++)
  35. {
  36. char ch = line.charAt(x);
  37. if (ch == '0') // 空
  38. {
  39. spaceCount++;
  40. allSpaceCount++;
  41. if (y > 0)
  42. {
  43. space2top[y][x] = space2top[y - 1][x] + 1;
  44. if (y == H - 1 && space2top[y][x] > 1)
  45. {
  46. space2topCount[space2top[y][x]]++;
  47. }
  48. }
  49. else // if (y == 0)
  50. {
  51. space2top[y][x] = 1;
  52. }
  53. }
  54. else // if (ch == '1') // 埋
  55. {
  56. if (spaceCount > 1)
  57. {
  58. startPointX[startPointCount] = x - 1;
  59. startPointY[startPointCount] = y;
  60. startPointCount++;
  61. space2leftCount[spaceCount]++;
  62. }
  63. spaceCount = 0;
  64. // space2top[y][x] = 0; // 初期値のまんま
  65. if (y > 0) {
  66. space2topCount[space2top[y - 1][x]]++;
  67. }
  68. }
  69. space2left[y][x] = spaceCount;
  70. } // for(x)
  71. if (spaceCount > 1)
  72. {
  73. startPointX[startPointCount] = W - 1;
  74. startPointY[startPointCount] = y;
  75. startPointCount++;
  76. space2leftCount[spaceCount]++;
  77. }
  78. } // for(y)
  79.  
  80. final int N = Integer.parseInt(in.readLine());
  81. int[][] result = new int[301][301];
  82.  
  83.  
  84. if (W < 300) {
  85. for (int y = 0; y <= H; y++)
  86. {
  87. Arrays.fill(result[y], W + 1, 301, 1);
  88. }
  89. }
  90. for (int y = H + 1; y < 301; y++)
  91. {
  92. Arrays.fill(result[y], 0, 301, 1);
  93. }
  94.  
  95. for (int i = 0; i < N; i++)
  96. {
  97. String[] st = in.readLine().split(" ");
  98. int s = Integer.parseInt(st[0]);
  99. int t = Integer.parseInt(st[1]);
  100.  
  101. int count = 0;
  102.  
  103. //if (s <= H && t <= W)
  104. {
  105. if (result[s][t] > 0)
  106. {
  107. count = result[s][t] - 1;
  108. }
  109. else if (s != 1 && t != 1)
  110. {
  111. for (int j = 0; j < startPointCount; j++)
  112. {
  113. int x = startPointX[j];
  114. int y = startPointY[j];
  115. int seekLength = space2left[y][x] - t + 1;
  116.  
  117. for (int dx = 0; dx < seekLength; dx++)
  118. {
  119. int tx = x - dx;
  120. if (space2top[y][tx] >= s)
  121. {
  122. int dy;
  123. for (dy = 0; dy < s; dy++)
  124. {
  125. if (space2left[y - dy][tx] < t)
  126. {
  127. break;
  128. }
  129. } // for(dy)
  130. if (dy == s)
  131. {
  132. count++;
  133. }
  134. }
  135. } // for(dx)
  136. } // for(j)
  137. }
  138. else if (s != 1)
  139. {
  140. for (int j = s; j <= H; j++)
  141. {
  142. count += space2topCount[j] * (j - s + 1);
  143. }
  144. }
  145. else if (t != 1)
  146. {
  147. for (int j = t; j <= W; j++)
  148. {
  149. count += space2leftCount[j] * (j - t + 1);
  150. }
  151. }
  152. else // if (s == 1 && t == 1)
  153. {
  154. count = allSpaceCount;
  155. }
  156. }
  157. System.out.println(count);
  158. result[s][t] = count + 1;
  159. } // for(i)
  160.  
  161. } // void main([String)
  162.  
  163. } // class Main
Success #stdin #stdout 0.07s 380224KB
stdin
5 5
00000
00100
00010
10001
10000
7
2 2
1 1
3 2
3 2
2 3
3 1
1 3
stdout
6
20
2
2
1
6
7