Codeforces 1080C- Masha and two friends

时间:2021-03-25 16:45:12

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;
}