Submission #261154

# Submission time Handle Problem Language Result Execution time Memory
261154 2020-08-11T12:55:21 Z idk321 Rectangles (IOI19_rect) Java 11
0 / 100
110 ms 11016 KB
import java.util.Arrays;

class rect {
	boolean[][] visited;

	public long count_rectangles(int[][] a) {
		int n = a.length;
		int m = a[0].length;

		if (n <= 2 || m <= 2) return 0;

		boolean allZeroAndOne = true;
		for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (a[i][j] != 0 && a[i][j] != 1) allZeroAndOne = false;

		if (n <= 3) {
			int currLength = 0;
			int goodStarts = 0;
			long res = 0;
			for (int i = 1; i < m - 1; i++) {
				int h = a[1][i];
				if (a[0][i] <= h || a[2][i] <= h) {
					goodStarts = 0;
				} else {
					if (a[1][i - 1] > h) goodStarts++;
					if (a[1][i + 1] > h) res += goodStarts;
				}
			}

			return res;
    		/*} else if (allZeroAndOne) {
    			visited = new boolean[n][m];
    			Arrays.fill(visited[0], true);
    			Arrays.fill(visited[n - 1], true);
    			for (int i = 0; i < n; i++) {
    				visited[i][0] = true;
    				visited[i][m - 1] = true;
    			}
    			for (int i = 1; i < n - 1; i++) {
    				for (int j = 1; j < m - 1; j++) {

    				}
    			} */
		} else if (allZeroAndOne) {
			int[][][] dpRight = new int[2][n][m];
			int[][][] dpDown = new int[2][n][m];
			for (int i = 1; i < n - 1; i++) {
				for (int j = m  - 2; j > 0; j--) {
					if (a[i + 1][j] > a[i][j]) dpRight[0][i][j] = dpRight[0][i][j + 1] + 1;
					if (a[i - 1][j] > a[i][j]) dpRight[1][i][j] = dpRight[1][i][j + 1] + 1;
				}
			}
			for (int i = n - 2; i > 0; i++) {
				for (int j = 1;  j < m - 1; j++) {
					if (a[i][j - 1] > a[i][j]) dpDown[0][i][j] = dpDown[0][i + 1][j] + 1;
					if (a[i][j + 1] > a[i][j]) dpDown[1][i][j] = dpDown[1][i + 1][j] + 1;
				}
			}

			long rect = 0;
			for (int i = 1; i < n - 1; i++) {
				for (int j = 1; j < m - 1; j++) {
					int x = dpRight[1][i][j];
					int y = dpDown[0][i][j];
					if (dpRight[0][i - y + 1][j] == x && dpDown[1][i][j + x - 1] == y) rect++;
				}
			}

			return rect;
		} else {
			int[][][] maxRight = new int[n][m][m];
			for (int i = 1; i < n - 1; i++) {
				for (int j = 1; j < m - 1; j++) {
					for (int k = j; k < m - 1; k++) {
						if (j == k) {
							maxRight[i][j][k] = a[i][j];
						} else {
							maxRight[i][j][k] = Math.max(a[i][k], maxRight[i][j][k - 1]);
						}
					}
				}
			}
			int[][][] maxDown = new int[m][n][n];
			for (int j = 1; j < m - 1; j++) {
				for (int i = 1; i < n - 1; i++) {
					for (int k = i; k < n - 1; k++) {
						if (i == k) {
							maxDown[j][i][k] = a[i][j];
						} else {
							maxDown[j][i][k] = Math.max(a[k][j], maxDown[j][i][k - 1]);
						}
					}
				}
			}



			long rect = 0;
			for (int i = 1; i < n - 1; i++) {
				for (int j = 1; j < m - 1; j++) {
					for (int k = i; k < n - 1; k++) {
						for (int l = j; l < m - 1; l++) {
							if (maxDown[l][i][k] >= a[i - 1][l] || maxDown[l][i][k] >= a[k + 1][l]) break;

							boolean shouldBreak = false;
							boolean possible = true;
							for (int o = i; o <= k; o++) {
								if (maxRight[o][j][l] >= a[o][j - 1]) {
									shouldBreak = true;
									break;
								}
								if (maxRight[o][j][l] >= a[o][l + 1]) {
									possible = false;
									break;
								}
							}
							if (shouldBreak) break;

							if (possible) {
								//System.out.println(i + " " + j + " " +  k + " " + l);
								rect++;
							}
						}
					}
				}
			}
			//System.out.println(Arrays.deepToString(maxDown));
			//System.out.println(Arrays.deepToString(rightOk));
			//System.out.println(maxDown[1][1][1]);

			return rect;
		}
	}

}
# Verdict Execution time Memory Grader output
1 Correct 78 ms 10232 KB Output is correct
2 Correct 97 ms 10660 KB Output is correct
3 Correct 99 ms 10364 KB Output is correct
4 Correct 93 ms 10460 KB Output is correct
5 Runtime error 99 ms 10104 KB Execution failed because the return code was nonzero
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 78 ms 10232 KB Output is correct
2 Correct 97 ms 10660 KB Output is correct
3 Correct 99 ms 10364 KB Output is correct
4 Correct 93 ms 10460 KB Output is correct
5 Runtime error 99 ms 10104 KB Execution failed because the return code was nonzero
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 78 ms 10232 KB Output is correct
2 Correct 97 ms 10660 KB Output is correct
3 Correct 99 ms 10364 KB Output is correct
4 Correct 93 ms 10460 KB Output is correct
5 Runtime error 99 ms 10104 KB Execution failed because the return code was nonzero
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 78 ms 10232 KB Output is correct
2 Correct 97 ms 10660 KB Output is correct
3 Correct 99 ms 10364 KB Output is correct
4 Correct 93 ms 10460 KB Output is correct
5 Runtime error 99 ms 10104 KB Execution failed because the return code was nonzero
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 99 ms 11016 KB Output is correct
2 Correct 110 ms 10872 KB Output is correct
3 Correct 100 ms 10352 KB Output is correct
4 Correct 86 ms 10104 KB Output is correct
5 Incorrect 103 ms 10808 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 82 ms 10320 KB Execution failed because the return code was nonzero
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 78 ms 10232 KB Output is correct
2 Correct 97 ms 10660 KB Output is correct
3 Correct 99 ms 10364 KB Output is correct
4 Correct 93 ms 10460 KB Output is correct
5 Runtime error 99 ms 10104 KB Execution failed because the return code was nonzero
6 Halted 0 ms 0 KB -