#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll Coord[6005],Tag[6005];
//Coord 记录所有水平方向线的高度,Tag记录当前两条线之间黑 (-1) 或白 (1) 的数量
char Col[5];
struct Square{
ll odd,even;
Square(){}
Square(ll O,ll E){odd=O,even=E;}
#define Square_OPERATOR(op) Square operator op (const Square &t){return Square(odd op t.odd,even op t.even);}//对应相加、乘
Square_OPERATOR(+=);
Square_OPERATOR(-=);
Square_OPERATOR(*);
}W,B,AnsW,AnsB,Squ;
struct UpRight{
ll x,l,r,Type;
UpRight(){}
UpRight(ll X,ll L,ll R,ll T){x=X,l=L,r=R,Type=T;}
}Up[6005];
bool cmpUp(UpRight x,UpRight y){return x.x<y.x;}
Square Get(ll l,ll r)//一维线中有多少奇、偶线
{
Square ret=Square((r-l)>>1,(r-l)>>1);
if((r-l)&1) (r&1)?ret.odd++:ret.even++;
return ret;
}
int main() {
ll n,m,p;
scanf("%lld %lld %lld",&n,&m,&p);
ll U=0,C=0;
for(ll i=1,x,y,d;i<=p;i++)
{
scanf("%s %lld %lld %lld",Col+1,&x,&y,&d);
x=x+y; y=x-2*y;
ll Type=((Col[1]=='W')?1:-1);
Up[++U]=UpRight(x-d-1,y-d-1,y+d,Type);//依次为该竖直线所在的横坐标、纵坐标的范围和种类
Up[++U]=UpRight(x+d, y-d-1,y+d,-Type);
Coord[++C]=y-d-1;
Coord[++C]=y+d;
}
sort(Up+1,Up+1+U,cmpUp);
sort(Coord+1,Coord+1+C); C=unique(Coord+1,Coord+1+C)-Coord-1;
ll Last=Up[1].x;
for(ll i=1;i<=U;i++)
{
Squ=Get(Last,Up[i].x);//得到从上一条竖直线到这一条的奇和偶的竖直线个数
AnsW+=Squ*W; AnsB+=Squ*B;//水平 × 竖直 线即为点的个数
Last=Up[i].x;
ll l,r,col=Up[i].Type;
l=lower_bound(Coord+1,Coord+1+C,Up[i].l)-Coord+1;
r=lower_bound(Coord+1,Coord+1+C,Up[i].r)-Coord;
for(ll j=l;j<=r;j++)
{
Squ=Get(Coord[j-1],Coord[j]);//得到当前枚举的竖直线内所有水平线之间的奇、偶线个数
if(Tag[j]==0&&col==1) W+=Squ;
if(Tag[j]==0&&col==-1) B+=Squ;
if(Tag[j]==1&&col==-1) W-=Squ;
if(Tag[j]==-1&&col==1) B-=Squ;
Tag[j]+=col;
//根据情况维护当前枚举的竖直线到下一条之间的水平线的奇、偶个数
}
}
printf("%lld %lld\n",AnsW.odd+AnsW.even,AnsB.odd+AnsB.even);
return 0;
}
P5976 [CEOI2008] Dominance
最新推荐文章于 2024-09-13 16:27:15 发布