# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1203230 | SpyrosAliv | Rectangles (IOI19_rect) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<pair<int, int>> delta = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
vector<vector<int>> g;
int n, m;
vector<vector<bool>> vis;
int u, d, l, r, sz;
bool inside(int i, int j) {
return i >= 0 && i < n && j >= 0 && j < m;
}
void dfs(int i, int j) {
if (!inside(i, j) || g[i][j] || vis[i][j]) return;
vis[i][j] = true;
sz++;
u = min(u, i);
d = max(d, i);
l = min(l, j);
r = max(r, j);
for (auto [di, dj]: delta) {
dfs(i + di, j + dj);
}
}
ll count_rectangles(vector<vector<int>> G) {
g = G;
n = g.size();
m = g[0].size();
if (n <= 2 || m <= 2) return 0;
vector<int> bad(m, 0);
for (int i = 1; i < m-1; i++) {
if (g[1][i] >= g[0][i] || g[1][i] >= g[2][i]) bad[i] = 1;
}
bad[m-1] = true;
ll ans = 0;
for (int i = 1; i < m-1; i++) {
int mx = g[1][i];
for (int j = 0; j < m; j++) {
if (i + j >= m-1) continue;
if (bad[i+j]) break;
mx = max(mx, g[1][i+j]);
if (mx < g[1][i-1] && mx < g[1][i+j+1]) ans++;
}
}
return ans;
}
int main() {
int N, M; cin >> N >> M;
vector<vector<int>> G(N, vector<int>(M, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) cin >> G[i][j];
}
cout << count_rectangles(G) << "\n";
}