题目链接
题意:给你一个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;
}
}