Submission #589516

#TimeUsernameProblemLanguageResultExecution timeMemory
589516Soumya1Rectangles (IOI19_rect)C++17
50 / 100
538 ms1048576 KiB
#include "rect.h" #include <bits/stdc++.h> #ifdef __LOCAL__ #include <debug_local.h> #endif using namespace std; long long count_rectangles(vector<vector<int>> a) { long long ans = 0; int n = a.size(); int m = a[0].size(); if (n <= 2) return 0; if (m <= 2) return 0; bool oneorzero = true; for (auto i : a) { for (int j : i) { oneorzero &= (j <= 1); } } if (n <= 3) { vector<int> ok(m); for (int i = 1; i < m - 1; i++) ok[i] = (a[0][i] > a[1][i] && a[2][i] > a[1][i]); for (int i = 1; i < m - 1; i++) { int cur_max = 0; for (int j = i; j < m - 1; j++) { if (!ok[j]) break; cur_max = max(cur_max, a[1][j]); if (a[1][i - 1] > cur_max && a[1][j + 1] > cur_max) ans++; } } return ans; } if (oneorzero) { vector<vector<int>> p(n + 1, vector<int> (m + 1)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { p[i][j] = p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1] + (a[i - 1][j - 1] ^ 1); } } auto sum = [&](int i, int j, int ii, int jj) { return p[ii][jj] - p[i - 1][jj] - p[ii][j - 1] + p[i - 1][j - 1]; }; vector<vector<int>> row(n, vector<int> (m)); vector<vector<int>> col(m, vector<int> (n)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { row[i][j] = (j == 0 ? 0 : row[i][j - 1]) + a[i][j]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { col[i][j] = (j == 0 ? 0 : col[i][j - 1]) + a[j][i]; } } vector<vector<int>> to_right(n, vector<int> (m)); auto to_down = to_right; for (int i = 0; i < n; i++) { for (int j = m - 1; j >= 0; j--) { if (a[i][j] == 1) to_right[i][j] = j; else to_right[i][j] = (j == m - 1 ? m : to_right[i][j + 1]); } } for (int i = n - 1; i >= 0; i--) { for (int j = 0; j < m; j++) { if (a[i][j] == 1) to_down[i][j] = i; else to_down[i][j] = (i == n - 1 ? n : to_down[i + 1][j]); } } for (int i = 1; i < n - 1; i++) { for (int j = 1; j < m - 1; j++) { if (a[i][j]) continue; if (to_right[i][j] >= m) continue; if (to_down[i][j] >= n) continue; int r = to_right[i][j], d = to_down[i][j]; if (row[i - 1][r - 1] - row[i - 1][j - 1] != r - j) continue; if (row[d][r - 1] - row[d][j - 1] != r - j) continue; if (col[r][d - 1] - col[r][i - 1] != d - i) continue; if (col[j - 1][d - 1] - col[j - 1][i - 1] != d - i) continue; if (sum(i + 1, j + 1, d, r) != (d - i) * (r - j)) continue; ans++; } } return ans; } int max_val[n][n][m]; bool good[n][n][m]; memset(max_val, 0, sizeof max_val); memset(good, 0, sizeof good); for (int i = 1; i < n - 1; i++) { for (int j = 1; j < m - 1; j++) { for (int ii = i; ii < n - 1; ii++) { max_val[i][ii][j] = (i == ii ? a[i][j] : max(a[ii][j], max_val[i][ii - 1][j])); good[i][ii][j] = (max_val[i][ii][j] < min(a[i - 1][j], a[ii + 1][j])); } } } int mx[m][m][n]; bool gg[m][m][n]; memset(mx, 0, sizeof mx); memset(gg, 0, sizeof gg); for (int i = 1; i < m - 1; i++) { for (int j = 1; j < n - 1; j++) { for (int ii = i; ii < m - 1; ii++) { mx[i][ii][j] = (i == ii ? a[j][i] : max(a[j][ii], mx[i][ii - 1][j])); gg[i][ii][j] = (mx[i][ii][j] < min(a[j][i - 1], a[j][ii + 1])); } } } for (int i = 1; i < n - 1; i++) { for (int j = 1; j < m - 1; j++) { for (int ii = i; ii < n - 1; ii++) { for (int jj = j; jj < m - 1; jj++) { if (!good[i][ii][jj]) break; bool g = true; for (int x = i; x <= ii; x++) g &= gg[j][jj][x]; if (g) ans++; } } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...