P5976 [CEOI2008] Dominance

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值