题目:https://www.luogu.org/problemnew/show/CF1080C
题意:一个n*m的黑白相间棋盘,输入四个点,两个点构成一个矩形,第一个矩形把相应位置涂成白色,第二个矩形把相应位置涂成黑色,而且黑色能覆盖白色,要求输出黑色和白色格子的数量。
题解:
注意细节就行,分两种情况,一种是两个矩形没有相交,另一种是两个矩形相交,黑色会把第一个矩形的白色覆盖成黑色。
#include<iostream> //Q
#include<algorithm>
using namespace std;
long long x[4],y[4];
long long white,black;
int main()
{
std::ios::sync_with_stdio(false);
long long n;
cin>>n;
while(n--)
{
long long a,b;
cin>>a>>b;
for(int i=0;i<4;i++)
cin>>x[i]>>y[i];
long long row,cow;
white=(a*b+1)/2;
row=x[1]-x[0]+1;
cow=y[1]-y[0]+1;
if(row%2&&cow%2&&x[0]%2==y[0]%2)
white+=(row*cow)/2;
else
white+=(row*cow+1)/2;
row=x[3]-x[2]+1;
cow=y[3]-y[2]+1;
if(row%2&&cow%2&&x[2]%2==y[2]%2)
white-=(row*cow+1)/2;
else
white-=(row*cow)/2;
int x1=max(x[0],x[2]);
int y1=max(y[0],y[2]);
int x2=min(x[1],x[3]);
int y2=min(y[1],y[3]);
if(x1<=x2&&y1<=y2){
row=x2-x1+1;
cow=y2-y1+1;
if(row%2&&cow%2&&x1%2==y1%2)
white-=(row*cow)/2;
else
white-=(row*cow+1)/2;
}
cout<<white<<" "<<a*b-white<<endl;
}
return 0;
}