http://codeforces.com/problemset/problem/1080/C
给定一个棋盘,(1,1)的位置是白色,观察可以知道,如果横纵坐标之和是偶数,那么是白色,奇数的话就是黑色。
只要算出染色以后白色方块的数量,减去面积,就可以得到黑色方块的数量
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
typedef long long ll;
using namespace std;
//计算矩形中白色方块的数量
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;
}
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 ()
{
ll n,m,T;
ll x1,y1,x2,y2;
ll x3,y3,x4,y4;
cin >> T;
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 = (n*m+1)/2+b1-w2;
//看两个矩形是否相交,相交的部分都会变成黑色,所以要计算变黑之前,里面的白色的方块的数量
ll minx = min(x2,x4),miny = min(y2,y4);
ll maxx = max(x1,x3),maxy = max(y1,y3);
if(minx >= maxx && miny >= maxy)
answ -= paintb(maxx,maxy,minx,miny);
cout << answ << " " << n*m-answ << endl;
}
return 0;
}