题意:先给出一个n行m列的矩阵,这个矩阵是黑白交错的,左下角是白的,然后再给出一个矩阵,这个矩阵就全部染成白色的,之后再给出一个矩阵,这个矩阵染成黑色的,数据范围是1e9,问最后白色块和黑色块分别由多少?
题解:首先可以算出这个大矩阵的黑色块和白色块分别有多少个,然后我们算下要染成白色矩阵中的白色和黑色块的个数,如果这个矩阵面积是偶数的,那么必然黑色和白色都是面积的一半,如果是奇数的呢?找找规律,白色块的纵坐标加横坐标是偶数,也就是我们只用判一下左下角的横纵坐标相加是偶数还是奇数,也就能确定此时这个矩阵里的白色块多一个还是黑色块多一个,同理,要染成黑色的也算一下里面原来有多少个黑色块和白色块,然后还得算一下两个矩阵相交的里面的有多少个黑色块和白色块,之后我们得算出这两个矩阵面积并外的白色块和黑色块有多少个(就是除过这两个被弄过的矩阵的外围的),要算黑的用原来的总的黑的减去要染成白色的中的黑色的,再减去要染成黑色中的黑色的,之后再加上相交的黑色的,就是此时外围黑色的了,之后黑色再加一下染成黑色的那块面积,白色通过总面积减去黑色的即可算出来。
立个flag:人傻就要多做题,本年度目标是zky爷1800题,向Claris学习,Fighting for WF。
附上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
ll ans1=n*m;
ll hei,bai;
if(ans1%2){
bai=ans1/2+1;
hei=ans1/2;
}else{
hei=bai=ans1/2;
}
ll x1,y1,x2,y2;
ll x3,y3,x4,y4;
ll m1,m2,n1,n2;
cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
x2++;y2++;x4++;y4++;
m1=min(max(x1,x2),max(x3,x4));
n1=min(max(y1,y2),max(y3,y4));
m2=max(min(x1,x2),min(x3,x4));
n2=max(min(y1,y2),min(y3,y4));
ll baim=(y2-y1)*(x2-x1);
ll baih=0,baiw=0;
if(baim%2){
if((x1+y1)%2==0){
baiw=baim/2+1;
baih=baim/2;
}else{
baih=baim/2+1;
baiw=baim/2;
}
}else{
baih=baiw=baim/2;
}
ll heim=(y4-y3)*(x4-x3);
ll heih=0,heiw=0;
if(heim%2){
if((x3+y3)%2==0){
heiw=heim/2+1;
heih=heim/2;
}else{
heih=heim/2+1;
heiw=heim/2;
}
}else{
heih=heiw=heim/2;
}
ll jiao=0,jiaoh=0,jiaow=0;
if(m1>m2&&n1>n2){
jiao=(m1-m2)*(n1-n2);
if(jiao%2){
if((m2+n2)%2==0){
jiaow=jiao/2+1;
jiaoh=jiao/2;
}else{
jiaoh=jiao/2+1;
jiaow=jiao/2;
}
}else{
jiaow=jiao/2;
jiaoh=jiao/2;
}
}
hei=hei-baih-heih+jiaoh;
hei+=heim;
bai=ans1-hei;
cout<<bai<<" "<<hei<<endl;
}
return 0;
}