Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS 228
- #include <iostream>
- #include <vector>
- #include <string>
- #include <set>
- #include <map>
- #include <sstream>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <cassert>
- #define lol long long
- using namespace std;
- const int MAXN = 4020;
- int events[MAXN][MAXN];
- int cornerMsk[MAXN][MAXN];
- int builtin_popcount(int x) {
- int res = 0;
- while (x > 0) {
- res += x % 2;
- x /= 2;
- }
- return res;
- }
- int partly(int msk) {
- if (msk == 0) {
- return 0;
- }
- if ((msk & 10) == 10) {
- return 4;
- }
- if ((msk & 5) == 5) {
- return 4;
- }
- int bits = builtin_popcount(msk);
- if (bits == 1) {
- return 2;
- }
- if (bits == 2) {
- return 3;
- }
- }
- int main()
- {
- int n;
- cin >> n;
- for (int it = 0; it < n; it++) {
- char tp[5];
- int x, y, d;
- scanf("%s%d%d%d", tp, &x, &y, &d);
- x += MAXN / 2;
- y += MAXN / 2;
- if (tp[0] == 'A') {
- int down = y - d / 2;
- int up = y + d / 2 - 1;
- int left = x - d / 2;
- int right = x + d / 2;
- //cerr << down << " " << up << " " << left << " " << right << endl;
- for (int i = down; i <= up; i++) {
- events[i][left]++;
- events[i][right]--;
- }
- }
- else {
- int down = y - d / 2;
- int up = y + d / 2 - 1;
- int left = x - 1;
- int right = x;
- for (int i = down; i < y; i++) {
- cornerMsk[i][left] |= 8;
- cornerMsk[i][right] |= 4;
- int leftFull = left + 1;
- int rightFull = right - 1;
- if (leftFull <= rightFull) {
- events[i][leftFull]++;
- events[i][rightFull + 1]--;
- }
- left--;
- right++;
- }
- left++;
- right--;
- for (int i = y; i <= up; i++) {
- cornerMsk[i][left] |= 1;
- cornerMsk[i][right] |= 2;
- int leftFull = left + 1;
- int rightFull = right - 1;
- if (leftFull <= rightFull) {
- events[i][leftFull]++;
- events[i][rightFull + 1]--;
- }
- left++;
- right--;
- }
- }
- }
- /*
- for (int i = 0; i < MAXN; i++) {
- for (int j = 0; j < MAXN; j++) {
- if (cornerMsk[i][j] != 0) {
- cout << i << " " << j << " " << cornerMsk[i][j] << endl;
- }
- }
- }*/
- int ansFull = 0;
- int ansQuarter = 0;
- for (int i = 0; i < MAXN; i++) {
- int bal = 0;
- for (int j = 0; j < MAXN; j++) {
- /*if (events[i][j] != 0) {
- cerr << i << " " << j << endl;
- }*/
- bal += events[i][j];
- if (bal > 0) {
- ansFull++;
- }
- else {
- ansQuarter += partly(cornerMsk[i][j]);
- }
- }
- }
- //cout << ansFull << " " << ansQuarter << endl;
- int ansFloor = ansFull + ansQuarter / 4;
- ansQuarter %= 4;
- cout << ansFloor << "." << ansQuarter * 25;
- if (ansQuarter == 0) {
- cout << "0";
- }
- cout << endl;
- }
- /*
- 2
- A 0 0 2
- B 1 0 2
- 8
- A -7 10 4
- B 3 10 8
- A -6 6 6
- A -2 5 8
- B 3 -1 8
- B -7 -4 8
- A 3 9 2
- B 8 6 6
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement