1+ /* *
2+ * @file 10537.cpp
3+ * @author Macesuted ([email protected] ) 4+ * @date 2025-10-07
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #ifndef LOCAL
14+ #define endl ' \n '
15+ #endif
16+
17+ bool mem1;
18+
19+ #define maxn 2005
20+
21+ struct ST {
22+ int16_t a[4 ];
23+ int siz = 0 ;
24+
25+ bool find (int16_t v) { return count (a, a + siz, v); }
26+ void add (int16_t v) { return !v || find (v) || siz == 4 ? 0 : a[siz++] = v, void (); }
27+ void add (const ST& o) {
28+ for (int i = 0 ; i < o.siz ; i++) add (o.a [i]);
29+ return ;
30+ }
31+ };
32+
33+ int a[maxn][maxn];
34+ ST NW[maxn][maxn], NE[maxn][maxn], SW[maxn][maxn], SE[maxn][maxn];
35+
36+ void solve (void ) {
37+ int n, m;
38+ cin >> n >> m;
39+
40+ for (int i = 1 ; i <= n; i++)
41+ for (int j = 1 ; j <= n; j++) {
42+ cin >> a[i][j];
43+ NW[i][j].add (a[i][j]), NE[i][j].add (a[i][j]), SW[i][j].add (a[i][j]), SE[i][j].add (a[i][j]);
44+ }
45+
46+ for (int i = 1 ; i <= n; i++)
47+ for (int j = 1 ; j <= n; j++) NW[i][j].add (NW[i - 1 ][j]), NW[i][j].add (NW[i][j - 1 ]);
48+
49+ for (int i = 1 ; i <= n; i++)
50+ for (int j = n; j >= 1 ; j--) NE[i][j].add (NE[i - 1 ][j]), NE[i][j].add (NE[i][j + 1 ]);
51+
52+ for (int i = n; i >= 1 ; i--)
53+ for (int j = 1 ; j <= n; j++) SW[i][j].add (SW[i + 1 ][j]), SW[i][j].add (SW[i][j - 1 ]);
54+
55+ for (int i = n; i >= 1 ; i--)
56+ for (int j = n; j >= 1 ; j--) SE[i][j].add (SE[i + 1 ][j]), SE[i][j].add (SE[i][j + 1 ]);
57+
58+ int ans = 0 ;
59+ for (int i = 2 ; i < n; i++)
60+ for (int j = 2 ; j < n; j++) {
61+ if (a[i][j]) continue ;
62+
63+ array<ST, 4 > rec = {NW[i - 1 ][j - 1 ], NE[i - 1 ][j + 1 ], SW[i + 1 ][j - 1 ], SE[i + 1 ][j + 1 ]};
64+
65+ sort (rec.begin (), rec.end (), [](const ST& a, const ST& b) -> bool { return a.siz < b.siz ; });
66+
67+ bool brk = false ;
68+ for (int id1 = 0 ; id1 < rec[0 ].siz && !brk; id1++) {
69+ int i1 = rec[0 ].a [id1];
70+ for (int id2 = 0 ; id2 < rec[1 ].siz && !brk; id2++) {
71+ int i2 = rec[1 ].a [id2];
72+ if (i1 != i2)
73+ for (int id3 = 0 ; id3 < rec[2 ].siz && !brk; id3++) {
74+ int i3 = rec[2 ].a [id3];
75+ if (i1 != i3 && i2 != i3)
76+ for (int id4 = 0 ; id4 < rec[3 ].siz && !brk; id4++) {
77+ int i4 = rec[3 ].a [id4];
78+ if (i1 != i4 && i2 != i4 && i3 != i4) ans++, brk = true ;
79+ }
80+ }
81+ }
82+ }
83+ }
84+
85+ cout << ans << endl;
86+
87+ return ;
88+ }
89+
90+ bool mem2;
91+
92+ int main () {
93+ ios::sync_with_stdio (false ), cin.tie (nullptr );
94+ #ifdef LOCAL
95+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
96+ #endif
97+
98+ int _ = 1 ;
99+ while (_--) solve ();
100+
101+ #ifdef LOCAL
102+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
103+ #endif
104+ return 0
0 commit comments