Submission #155522

#TimeUsernameProblemLanguageResultExecution timeMemory
155522flashmtRectangles (IOI19_rect)C++17
0 / 100
206 ms189944 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2525, A = 7e6; int m, n, a[N][N]; int l[N][N], r[N][N], u[N][N], d[N][N]; int treeRow[N][N], treeCol[N][N]; vector<pair<int, int>> id[A + 5]; void addTree(int tree[], int x) { for (int i = x; i < N; i += i & -i) tree[i]++; } int getTree(int tree[], int x) { int res = 0; for (int i = x; i; i -= i & -i) res += tree[i]; return res; } void add(int x, int y) { addTree(treeRow[x], y); addTree(treeCol[y], x); l[x][r[x][y]] = l[x][y]; r[x][l[x][y]] = r[x][y]; u[d[x][y]][y] = u[x][y]; d[u[x][y]][y] = d[x][y]; } int isEmpty(int tree[], int from, int to) { return getTree(tree, to) == getTree(tree, from - 1); } int isFull(int tree[], int from, int to) { return getTree(tree, to) - getTree(tree, from - 1) == to - from + 1; } int isRect(int x, int y) { int curL = l[x][y] + 1, curR = r[x][y] - 1, curU = u[x][y] + 1, curD = d[x][y] - 1; if (curL < 2 || curU < 2 || curR > n - 1 || curL > m - 1) return 0; if (a[x][y] >= min({a[x][curL - 1], a[x][curR + 1], a[curU - 1][y], a[curD + 1][y]})) return 0; if (!isFull(treeRow[curU], curL, curR) || !isFull(treeRow[curD], curL, curR)) return 0; if (!isFull(treeCol[curL], curU, curD) || !isFull(treeCol[curR], curU, curD)) return 0; return 1; } long long count_rectangles(vector<vector<int>> _a) { m = _a.size(); n = _a[0].size(); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) { id[_a[i - 1][j - 1]].push_back({i, j}); a[i][j] = _a[i - 1][j - 1]; u[i][j] = i - 1; d[i][j] = i + 1; l[i][j] = j - 1; r[i][j] = j + 1; } long long ans = 0; for (int v = 0; v <= A; v++) if (!id[v].empty()) { for (auto u : id[v]) add(u.first, u.second); for (auto u : id[v]) ans += isRect(u.first, u.second); } 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...