C. Masha and two friends(处理矩形相交)

博客围绕一个n*m黑白相间棋盘展开。给定两个矩形,第一个将范围内棋盘涂白,第二个涂黑。题解先统计矩形内黑白方格数,指出n*m为奇数时左下角颜色影响方格数量;还提及判断两矩形是否相交及相交矩形坐标的方法。

题目链接

题意:给你一个n*m的黑白相间的棋盘。给你两个矩形的左下角和右上角,第一个矩形将矩形范围内的棋盘全涂成白色,第二个矩形将矩形范围内的棋盘涂成黑色。问现在棋盘,白色方格有多少个,黑色方格有多少个。

题解:首先我们要统计矩形范围内,白色方格和黑色方格分别有多少个。不难得出,当n*m是奇数时,左下角如果是白色方格,那白色方格多一个,如果是黑色方格那黑色方格多一个。

然后就要判断这两个矩形是否相交了。如果相交那么黑色的会把之前涂成白色的方格覆盖掉。那怎么判断是否相交呢?

ll n1,n2,m1,m2;
n1=min(max(x1,x2),max(x3,x4));
m1=min(max(y1,y2),max(y3,y4));
n2=max(min(x1,x2),min(x3,x4));
m2=max(min(y1,y2),min(y3,y4));
if(n1>=n2&&m1>=m2)

x1,y1  x2,y2 为第一个矩形的左下角和右上角。x3,y3  x4,y4 为第二个矩形的左下角和右上角。

如果满足if语句的条件,那么久说明这两个矩形相交,且相交得到的矩形左下角坐标为n2,m2,右上角坐标为n1,m1

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int T;
	cin>>T;
	while(T--){
		ll n,m,x1,x2,x3,x4,y1,y2,y3,y4;
		cin>>n>>m>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
		
		ll ans1=n*m/2,ans2=n*m/2;
		if(n%2==1&&m%2==1) ans1+=1;
		ll a1=x2-x1+1,b1=y2-y1+1;
		ans1+=a1*b1/2,ans2-=a1*b1/2;
	    if((x1+y1)%2==1){
	    	if(a1*b1%2==1)
	    	ans1+=1,ans2-=1; 
		}
		ll a2=x4-x3+1,b2=y4-y3+1;
		ans1-=a2*b2/2,ans2+=a2*b2/2;
		if((x3+y3)%2==0){
			if(a2*b2%2==1)
			ans1-=1,ans2+=1;
		}
		
		ll n1,n2,m1,m2;
		n1=min(max(x1,x2),max(x3,x4));
		m1=min(max(y1,y2),max(y3,y4));
		n2=max(min(x1,x2),min(x3,x4));
		m2=max(min(y1,y2),min(y3,y4));
		 
		if(n1>=n2&&m1>=m2){
			swap(n1,n2);swap(m1,m2);
			ll a3=n2-n1+1,b3=m2-m1+1;
			ans1-=a3*b3/2,ans2+=a3*b3/2;
			if((m1+n1)%2==1){
				if(a3%2==1&&b3%2==1)
				ans1-=1,ans2+=1;
			}
		}
		cout<<ans1<<' '<<ans2<<endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值