This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <string.h>
#define N 100000
#define M 50
int di[] = { -1, 0, 1, 0 };
int dj[] = { 0, -1, 0, 1 };
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int cross(int x1, int y1, int x2, int y2) {
return x1 * y2 - x2 * y1;
}
int main() {
static char cc[N][M + 1], visited[N * M * 4];
static int nxt[N * M * 4];
int n, m, h, h_, i, i_, j, j_, ijh;
long long ans;
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++)
scanf("%s", cc[i]);
ans = 0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (cc[i][j] == '1') {
ans += (long long) (i + 1) * (n - i);
if (j > 0 && cc[i][j - 1] == '1')
ans -= (long long) (i + 1) * (n - i);
if (i > 0 && cc[i - 1][j] == '1')
ans -= (long long) i * (n - i);
}
memset(nxt, -1, n * m * 4 * sizeof *nxt);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (cc[i][j] == '1')
for (h = 0; h < 4; h++) {
i_ = i - di[h], j_ = j - dj[h];
if (i_ >= 0 && i_ < n && j_ >= 0 && j_ < m && cc[i_][j_] == '1')
for (h_ = (h + 3) % 4; ; h_ = (h_ + 1) % 4) {
i_ = i + di[h_], j_ = j + dj[h_];
if (i_ >= 0 && i_ < n && j_ >= 0 && j_ < m && cc[i_][j_] == '1') {
nxt[(i * m + j) * 4 + h] = (i_ * m + j_) * 4 + h_;
break;
}
}
}
for (ijh = 0; ijh < n * m * 4; ijh++)
if (nxt[ijh] != -1 && !visited[ijh]) {
int imn, imx, a;
imn = n, imx = -1, a = 0;
while (!visited[ijh]) {
visited[ijh] = 1;
i = ijh / 4 / m, j = ijh / 4 % m, h = ijh % 4;
a += cross(i - di[h], j - dj[h], i, j);
imn = min(imn, i), imx = max(imx, i);
ijh = nxt[ijh];
}
if (a < 0)
ans += (long long) (imn + 1) * (n - imx);
}
printf("%lld\n", ans);
return 0;
}
Compilation message (stderr)
raspad.c: In function 'main':
raspad.c:23:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
23 | scanf("%d%d", &n, &m);
| ^~~~~~~~~~~~~~~~~~~~~
raspad.c:25:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
25 | scanf("%s", cc[i]);
| ^~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |