Codeforces 1080C- Masha and two friends

在这里插入图片描述

AC代码

#include <bits/stdc++.h>
#define ll long long
const int maxn=1e6+10;
using namespace std;
inline ll paintw(ll x1,ll y1,ll x2,ll y2)
{
	ll n=x2-x1+1;
	ll m=y2-y1+1;
	// 左下角是黑色,向下取整
	if((x1+y1)&1)
		return n*m/2;
	// 左下角是白色,向上取整
	else
		return (n*m+1)/2;
}
inline ll paintb(ll x1,ll y1,ll x2,ll y2)
{
	ll n=x2-x1+1;
	ll m=y2-y1+1;
	return n*m-paintw(x1,y1,x2,y2);
}
int main(int argc, char const *argv[])
{
	int t;
	ll n,m;
	cin>>t;
	ll x1,x2,x3,x4;
	ll y1,y2,y3,y4;
	while(t--)
	{
		cin>>n>>m;
		cin>>x1>>y1>>x2>>y2;
		cin>>x3>>y3>>x4>>y4;
		// 求出第一块区域的黑色数量和第二块区域的白色数量
		ll b1=paintb(x1,y1,x2,y2);
		ll w2=paintw(x3,y3,x4,y4);
		ll answ;
		// 左下角一定是白色,所以整个区域的白色数量向上取整
		// 第一块的白色数量增加b1,第二块白色数量较少w2
		answ=(n*m+1)/2+b1-w2;
		ll minx=min(x2,x4);ll maxx=max(x1,x3);
		ll miny=min(y2,y4);ll maxy=max(y1,y3);
		// 如果两区域有相交的部分,把该部分变成黑色
		if(minx>=maxx&&miny>=maxy)
			answ-=paintb(maxx,maxy,minx,miny);
		cout<<answ<<" "<<n*m-answ<<endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Friends-A/p/10324323.html