#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
/*const int MOD = 998244353;
inline int lgput(int a, int b) {
int ans = 1;
while(b > 0) {
if(b & 1) ans = (1LL * ans * a) % MOD;
b >>= 1;
a = (1LL * a * a) % MOD;
}
return ans;
}
inline void mod(int &x) {
if(x >= MOD)
x -= MOD;
}
inline void add(int &x, int y) {
x += y;
mod(x);
}
inline void sub(int &x, int y) {
x += MOD - y;
mod(x);
}
inline void mul(int &x, int y) {
x = (1LL * x * y) % MOD;
}
inline int inv(int x) {
return lgput(x, MOD - 2);
}*/
/*int fact[], invfact[];
inline void prec(int n) {
fact[0] = 1;
for(int i = 1; i <= n; i++) {
fact[i] = (1LL * fact[i - 1] * i) % MOD;
}
invfact[n] = lgput(fact[n], MOD - 2);
for(int i = n - 1; i >= 0; i--) {
invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD;
}
}
inline int comb(int n, int k) {
if(n < k) return 0;
return (1LL * fact[n] * (1LL * invfact[k] * invfact[n - k] % MOD)) % MOD;
}*/
using namespace std;
inline int get(char ch) {
return ch == 'W' ? 1 : -1;
}
struct Segm {
ll x, y1, y2;
int sign;
bool operator <(const Segm &other) const {
return x < other.x;
}
};
inline ll even(ll l, ll r) {
if(l > r) return 0;
return (r - l + 1) / 2 + (l % 2 == 0 && r % 2 == 0);
}
inline ll odd(ll l, ll r) {
return r - l + 1 - even(l, r);
}
map <ll, int> mp;
inline pair <ll, ll> get_even() {
pair <ll, ll> ans = {0, 0};
ll last, sum = 0;
bool first = 0;
for(auto it : mp) {
if(first) {
if(sum > 0) ans.first += even(last, it.first - 1);
if(sum < 0) ans.second += even(last, it.first - 1);
}
sum += it.second;
last = it.first;
first = 1;
}
return ans;
}
inline pair <ll, ll> get_odd() {
pair <ll, ll> ans = {0, 0};
ll last, sum = 0;
bool first = 0;
for(auto it : mp) {
if(first) {
if(sum > 0) ans.first += odd(last, it.first - 1);
if(sum < 0) ans.second += odd(last, it.first - 1);
}
sum += it.second;
last = it.first;
first = 1;
}
return ans;
}
int main() {
#ifdef HOME
ifstream cin("A.in");
ofstream cout("A.out");
#endif
int X, Y, i, j, n;
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> X >> Y >> n;
vector <Segm> segm;
for(i = 0; i < n; i++) {
int xx, yy, rr;
char ch;
cin >> ch >> xx >> yy >> rr;
ll x = xx - yy, y = xx + yy, r = rr;
int sign = get(ch);
segm.push_back({x - r, y - r, y + r + 1, sign});
segm.push_back({x + r + 1, y - r, y + r + 1, -sign});
}
sort(segm.begin(), segm.end());
ll black = 0, white = 0;
int sz = segm.size();
i = 0;
while(i < sz) {
j = i;
while(j < sz && segm[i].x == segm[j].x) {
mp[segm[j].y1] += segm[j].sign;
mp[segm[j].y2] -= segm[j].sign;
j++;
}
if(j < sz) {
auto e = get_even();
auto o = get_odd();
white += 1LL * e.first * even(segm[i].x, segm[j].x - 1) + 1LL * o.first * odd(segm[i].x, segm[j].x - 1);
black += 1LL * e.second * even(segm[i].x, segm[j].x - 1) + 1LL * o.second * odd(segm[i].x, segm[j].x - 1);
}
i = j;
}
cout << white << " " << black;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
632 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
4 ms |
376 KB |
Output is correct |
4 |
Correct |
29 ms |
528 KB |
Output is correct |
5 |
Correct |
35 ms |
504 KB |
Output is correct |
6 |
Correct |
3 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
376 KB |
Output is correct |
8 |
Correct |
17 ms |
504 KB |
Output is correct |
9 |
Correct |
28 ms |
520 KB |
Output is correct |
10 |
Correct |
34 ms |
504 KB |
Output is correct |
11 |
Correct |
39 ms |
504 KB |
Output is correct |
12 |
Correct |
2 ms |
376 KB |
Output is correct |
13 |
Correct |
43 ms |
632 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
39 ms |
504 KB |
Output is correct |
16 |
Correct |
28 ms |
532 KB |
Output is correct |
17 |
Correct |
2 ms |
376 KB |
Output is correct |
18 |
Correct |
4 ms |
376 KB |
Output is correct |
19 |
Correct |
3 ms |
376 KB |
Output is correct |
20 |
Correct |
5 ms |
376 KB |
Output is correct |