1
+ #include < iostream>
2
+ #include < bits/stdc++.h>
3
+
4
+ /* *
5
+ * Отсортируем все точки с левого верхнего угла по правый нижний: сначала строки, потом столбцы.
6
+ * Каждую полосу, длиной больше 1 добавим в результат, каждую полосу, длиной 1 сохраним на будущее в вектор sq.
7
+ *
8
+ * Аналогично отсортируем все точки снова, только теперь сначала столбцы, потом строки.
9
+ *
10
+ * Теперь у нас есть количество вертикальных и горизонтальных полос. Осталось проверить только полосы 1х1.
11
+ * Если полоса 1х1 встречается в векторе sq 2 раза, значит - квадрат 1х1 максимальен и по вертикали и по горизонтали
12
+ * => его следует добавить в результат
13
+ */
14
+
15
+ bool comp1 (std::pair<int , int > a, std::pair<int , int > b) {
16
+ if (a.first != b.first ) {
17
+ return a.first < b.first ;
18
+ } else {
19
+ return a.second < b.second ;
20
+ }
21
+ }
22
+
23
+ bool comp2 (std::pair<int , int > a, std::pair<int , int > b) {
24
+ if (a.second != b.second ) {
25
+ return a.second < b.second ;
26
+ } else {
27
+ return a.first < b.first ;
28
+ }
29
+ }
30
+
31
+ int main () {
32
+ int m, n, k, res = 0 ;
33
+
34
+ std::cin >> m >> n >> k;
35
+
36
+ std::vector<std::pair<int , int >> point;
37
+ std::vector<std::pair<int , int >> sq;
38
+
39
+ for (int i = 0 ; i < k; ++i) {
40
+ std::pair<int , int > p;
41
+ std::cin >> p.first >> p.second ;
42
+ p.first --;
43
+ p.second --;
44
+ point.push_back (p);
45
+ }
46
+
47
+ for (int i = 0 ; i < m; ++i) {
48
+ std::pair<int , int > p = {i, -1 };
49
+ std::pair<int , int > p2 = {i, n};
50
+ point.push_back (p2);
51
+ point.push_back (p);
52
+ }
53
+
54
+ for (int i = 0 ; i < n; ++i) {
55
+ std::pair<int , int > p = {-1 , i};
56
+ std::pair<int , int > p2 = {m, i};
57
+ point.push_back (p2);
58
+ point.push_back (p);
59
+ }
60
+
61
+ sort (point.begin (), point.end (), comp1);
62
+
63
+ for (int i = 0 ; i < point.size () - 1 ; ++i) {
64
+ if (point[i].first == point[i + 1 ].first ) {
65
+ if (point[i + 1 ].second - point[i].second - 1 > 1 ) {
66
+ res++;
67
+ } else if (point[i + 1 ].second - point[i].second - 1 == 1 ) {
68
+ std::pair<int , int > p (point[i].first , point[i].second + 1 );
69
+ sq.push_back (p);
70
+ }
71
+ }
72
+ }
73
+
74
+ sort (point.begin (), point.end (), comp2);
75
+ sort (sq.begin (), sq.end (), comp2);
76
+
77
+ for (int i = 0 ; i < point.size () - 1 ; ++i) {
78
+ if (point[i].second == point[i + 1 ].second ) {
79
+ if (point[i + 1 ].first - point[i].first - 1 > 1 ) {
80
+ res++;
81
+ } else if (point[i + 1 ].first - point[i].first - 1 == 1 ) {
82
+ std::pair<int , int > p (point[i].first + 1 , point[i].second );
83
+ sq.push_back (p);
84
+ }
85
+ }
86
+ }
87
+
88
+ sort (sq.begin (), sq.end (), comp1);
89
+
90
+ if (sq.size () > 1 ) {
91
+ int i = 0 ;
92
+ while (i < sq.size () - 1 ) {
93
+ if (sq[i] == sq[i + 1 ]) {
94
+ res++;
95
+ i++;
96
+ }
97
+ i++;
98
+ }
99
+ }
100
+
101
+ std::cout << " \n\n " << res;
102
+
103
+ return 0 ;
104
+ }
0 commit comments