Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS 228
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <string>
  6. #include <set>
  7. #include <map>
  8. #include <sstream>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <cmath>
  12. #include <cassert>
  13.  
  14. #define lol long long
  15.  
  16. using namespace std;
  17.  
  18. const int MAXN = 4020;
  19.  
  20. int events[MAXN][MAXN];
  21. int cornerMsk[MAXN][MAXN];
  22.  
  23. int builtin_popcount(int x) {
  24. int res = 0;
  25. while (x > 0) {
  26. res += x % 2;
  27. x /= 2;
  28. }
  29. return res;
  30. }
  31.  
  32. int partly(int msk) {
  33. if (msk == 0) {
  34. return 0;
  35. }
  36. if ((msk & 10) == 10) {
  37. return 4;
  38. }
  39.  
  40. if ((msk & 5) == 5) {
  41. return 4;
  42. }
  43.  
  44. int bits = builtin_popcount(msk);
  45. if (bits == 1) {
  46. return 2;
  47. }
  48. if (bits == 2) {
  49. return 3;
  50. }
  51. }
  52.  
  53. int main()
  54. {
  55. int n;
  56. cin >> n;
  57. for (int it = 0; it < n; it++) {
  58. char tp[5];
  59. int x, y, d;
  60. scanf("%s%d%d%d", tp, &x, &y, &d);
  61. x += MAXN / 2;
  62. y += MAXN / 2;
  63. if (tp[0] == 'A') {
  64. int down = y - d / 2;
  65. int up = y + d / 2 - 1;
  66.  
  67. int left = x - d / 2;
  68. int right = x + d / 2;
  69. //cerr << down << " " << up << " " << left << " " << right << endl;
  70. for (int i = down; i <= up; i++) {
  71. events[i][left]++;
  72. events[i][right]--;
  73. }
  74. }
  75. else {
  76. int down = y - d / 2;
  77. int up = y + d / 2 - 1;
  78.  
  79. int left = x - 1;
  80. int right = x;
  81. for (int i = down; i < y; i++) {
  82. cornerMsk[i][left] |= 8;
  83. cornerMsk[i][right] |= 4;
  84.  
  85. int leftFull = left + 1;
  86. int rightFull = right - 1;
  87. if (leftFull <= rightFull) {
  88. events[i][leftFull]++;
  89. events[i][rightFull + 1]--;
  90. }
  91. left--;
  92. right++;
  93. }
  94.  
  95. left++;
  96. right--;
  97.  
  98. for (int i = y; i <= up; i++) {
  99. cornerMsk[i][left] |= 1;
  100. cornerMsk[i][right] |= 2;
  101.  
  102. int leftFull = left + 1;
  103. int rightFull = right - 1;
  104. if (leftFull <= rightFull) {
  105. events[i][leftFull]++;
  106. events[i][rightFull + 1]--;
  107. }
  108. left++;
  109. right--;
  110. }
  111. }
  112. }
  113. /*
  114. for (int i = 0; i < MAXN; i++) {
  115. for (int j = 0; j < MAXN; j++) {
  116. if (cornerMsk[i][j] != 0) {
  117. cout << i << " " << j << " " << cornerMsk[i][j] << endl;
  118. }
  119. }
  120. }*/
  121.  
  122. int ansFull = 0;
  123. int ansQuarter = 0;
  124. for (int i = 0; i < MAXN; i++) {
  125. int bal = 0;
  126. for (int j = 0; j < MAXN; j++) {
  127. /*if (events[i][j] != 0) {
  128. cerr << i << " " << j << endl;
  129. }*/
  130. bal += events[i][j];
  131. if (bal > 0) {
  132. ansFull++;
  133. }
  134. else {
  135. ansQuarter += partly(cornerMsk[i][j]);
  136. }
  137. }
  138. }
  139.  
  140. //cout << ansFull << " " << ansQuarter << endl;
  141. int ansFloor = ansFull + ansQuarter / 4;
  142. ansQuarter %= 4;
  143. cout << ansFloor << "." << ansQuarter * 25;
  144. if (ansQuarter == 0) {
  145. cout << "0";
  146. }
  147. cout << endl;
  148. }
  149.  
  150. /*
  151. 2
  152. A 0 0 2
  153. B 1 0 2
  154.  
  155. 8
  156. A -7 10 4
  157. B 3 10 8
  158. A -6 6 6
  159. A -2 5 8
  160. B 3 -1 8
  161. B -7 -4 8
  162. A 3 9 2
  163. B 8 6 6
  164. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement