#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdint>
#define int long long
using namespace std;
struct event
{
int x, ys, ye, value;
};
int w, h, n, w_cells, b_cells;
void solve (vector <event> vec)
{
sort (vec.begin(), vec.end(), [] (event a, event b) {return a.x<b.x;});
vector <int> ys;
for (auto chestie : vec)
{
ys.push_back ({chestie.ys});
ys.push_back ({chestie.ye+1});
}
sort (ys.begin(), ys.end());
ys.resize (unique (ys.begin(), ys.end())-ys.begin());
int k=ys.size();
vector <int> mars (k+1, 0);
auto gety = [&] (int val)
{
return lower_bound (ys.begin(), ys.end(), val)-ys.begin()+1;
};
for (int i=0;i+1<vec.size();i++)
{
for (int j=gety (vec[i].ys);j<gety (vec[i].ye+1);j++)
mars[j]+=vec[i].value;
for (int j=1;j<k;j++)
{
int ret=(vec[i+1].x-vec[i].x)*(ys[j]-ys[j-1]);
if (mars[j]<0) b_cells+=ret;
if (mars[j]>0) w_cells+=ret;
}
}
}
void addTo (vector <event> &vec, int x, int y, int r, int v)
{
vec.push_back ({(x+y-r) >> 1, (-x+y-r) >> 1, (-x+y+r) >> 1, v});
vec.push_back ({((x+y+r) >> 1) +1, (-x+y-r) >> 1, (-x+y+r) >> 1, -v});
}
int32_t main ()
{
vector <event> even, odd;
cin >> w >> h >> n;
for (int i=1;i<=n;i++)
{
char type;
int x, y, r;
cin >> type >> x >> y >> r;
int value=(type=='W'?1:-1);
int displacement=(x+y+r)%2;
addTo (even, x, y, r-displacement, value);
addTo (odd, x, y, r+displacement-1, value);
}
solve (even);
solve (odd);
cout << w_cells << " " << b_cells << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |