题目链接
题目大意
给你一个长度为(n imes m (1le n,mle1e9))的矩阵
点((x,y))若((x+y)\%2=1)则为白色,否则为黑色
首先将一个区间变为全白,再将一个区间变为全黑
求最后矩阵的白色和黑色点
题目思路
首先要明白两个矩阵的相交矩阵怎么求
a=max(x1,x3),b=max(y1,y3);
c=min(x2,x4),d=min(y2,y4);
白色的点其实就是本来的白色 + 第一次操作的初始矩阵黑色 - 第二次操作的初始矩阵白色 - 相交初始矩阵的
黑色
代码
#include<bits/stdc++.h>
#define debug printf("
I am here
");
#define fi first
#define se second
typedef long long ll;
const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
using namespace std;
ll n,m;
ll getwhite(ll x1,ll y1,ll x2,ll y2){
// 返回这个区间本来有多少个白色
ll sum=(y2-y1+1)*(x2-x1+1);
if((x1+y1)%2==0){
return (sum+1)/2;
}else{
return sum/2;
}
}
int main(){
int _; scanf("%d",&_);
while(_--){
scanf("%lld%lld",&n,&m);
ll x1,y1,x2,y2,x3,y3,x4,y4;
ll a,b,c,d;
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
scanf("%lld%lld%lld%lld",&x3,&y3,&x4,&y4);
a=max(x1,x3),b=max(y1,y3);
c=min(x2,x4),d=min(y2,y4);
// 初始的白色点
ll bai=(n*m+1)/2;
bai+=(x2-x1+1)*(y2-y1+1)-getwhite(x1,y1,x2,y2);
bai-=getwhite(x3,y3,x4,y4);
if(c>=a&&d>=b){
bai-=(d-b+1)*(c-a+1)-getwhite(a,b,c,d);
}
printf("%lld %lld
",bai,n*m-bai);
}
return 0;
}