Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN = 1010;
  6. const int ue = 2e6;
  7.  
  8. int grid[MAXN][MAXN], mark[MAXN], p[ue];
  9. int X1[MAXN], Y1[MAXN], X2[MAXN], Y2[MAXN];
  10. int move_x[4] = {0, 0, -1, +1};
  11. int move_y[4] = {-1, +1, 0, 0};
  12. bool vis[MAXN][MAXN];
  13. int cnt = 0;
  14. int n, m, q;
  15.  
  16. bool valid(int x, int y) {
  17. if (x <= 0 || y <= 0 || x > n || y > m || vis[x][y] || grid[x][y] > 0) return false;
  18. return true;
  19. }
  20.  
  21. int id(int x, int y) {
  22. return x * 1001 + y;
  23. }
  24.  
  25. void dfs(int x, int y) {
  26. vis[x][y] = true;
  27. p[id(x, y)] = cnt;
  28. for (int i = 0; i < 4; i++) {
  29. int dx = x + move_x[i], dy = y + move_y[i];
  30. if (valid(dx, dy)) dfs(dx, dy);
  31. }
  32. }
  33.  
  34. int find(int a) {
  35. if (p[a] == a) return a;
  36. return p[a] = find(p[a]);
  37. }
  38.  
  39. void merge(int a, int b) {
  40. a = find(a);
  41. b = find(b);
  42. p[a] = b;
  43. }
  44.  
  45. void clear() {
  46. for (int i = 0; i < ue; i++) {
  47. p[i] = i;
  48. }
  49. for (int i = 0; i <= n + 1; i++) {
  50. grid[i][0] = ue;
  51. grid[i][m + 1] = ue;
  52. }
  53. for (int i = 0; i <= m + 1; i++) {
  54. grid[0][i] = ue;
  55. grid[n + 1][i] = ue;
  56. }
  57. }
  58.  
  59. int main() {
  60. //ios::sync_with_stdio(0); cin.tie(0);
  61. cin >> n >> m >> q;
  62. clear();
  63. for (int i = 0; i < q; i++) {
  64. cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
  65. if (X1[i] == X2[i]) {
  66. for (int j = Y1[i]; j <= Y2[i]; j++) {
  67. grid[X1[i]][j]++;
  68. }
  69. }
  70. if (Y1[i] == Y2[i]) {
  71. for (int k = X1[i]; k <= X2[i]; k++) {
  72. grid[k][Y1[i]]++;
  73. }
  74. }
  75. }
  76.  
  77. for (int i = 1; i <= n; i++) {
  78. for (int j = 1; j <= m; j++) {
  79. if (!vis[i][j] && grid[i][j] == 0) {
  80. dfs(i, j);
  81. cnt++;
  82. }
  83. }
  84. }
  85.  
  86. int last_cnt = cnt;
  87. vector<int> ans(q);
  88. ans[q] = cnt;
  89. set<int> st;
  90.  
  91. for (int i = q - 1; i >= 0; i--) {
  92. st.clear();
  93. cout << "EM -> " << i << '\n';
  94. if (X1[i] == X2[i]) {
  95. for (int j = Y1[i]; j <= Y2[i]; j++) {
  96. grid[X1[i]][j]--;
  97. if (grid[X1[i]][j - 1] == 0) {
  98. p[id(X1[i],j)] = find(id(X1[i], j - 1));
  99. }
  100. else {
  101. p[id(X1[i],j)] = last_cnt++;
  102. cnt++;
  103. }
  104. st.insert(find(id(X1[i], j)));
  105. }
  106.  
  107. for (int j = Y1[i]; j <= Y2[i]; j++) {
  108. if (grid[X1[i]][j]) continue;
  109. int id1 = id(X1[i] - 1, j);
  110. int id2 = id(X1[i] + 1, j);
  111. if (!grid[X1[i] - 1][j] && !grid[X1[i] + 1][j]) {
  112. st.insert(find(id1));
  113. st.insert(find(id2));
  114. }
  115. }
  116. }
  117.  
  118. if (Y1[i] == Y2[i]) {
  119. for (int k = X1[i]; k <= X2[i]; k++) {
  120. grid[k][Y1[i]]--;
  121. if (grid[k - 1][Y1[i]] == 0) {
  122. merge(id(k, Y1[i]), id(k - 1, Y1[i]));
  123. }
  124. else {
  125. p[id(k, Y1[i])] = last_cnt++;
  126. cnt++;
  127. }
  128. st.insert(find(id(k, Y1[i])));
  129. }
  130.  
  131. for (int k = X1[i]; k <= X2[i]; k++) {
  132. if (grid[k][Y1[i]]) continue;
  133. int id1 = id(k, Y1[i] - 1);
  134. int id2 = id(k, Y1[i] + 1);
  135. if (!grid[k][Y1[i] - 1] && !grid[k][Y1[i] + 1]) {
  136. st.insert(find(id1));
  137. st.insert(find(id2));
  138. }
  139. }
  140. }
  141.  
  142. int curr = *st.begin();
  143. for (auto x : st) {
  144. if (find(curr) != find(x)) {
  145. merge(curr, x);
  146. cout << "aq\n";
  147. cnt--;
  148. }
  149. }
  150. cout << "CNT = " << cnt << '\n';
  151. cout << "SIZE = " << st.size() << '\n';
  152. //cnt -= st.size();
  153. ans[i] = cnt;
  154. }
  155. cout << "-----\n";
  156. for (int i = 1; i <= q; i++) {
  157. cout << ans[i] << '\n';
  158. }
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement