题:https://codeforces.com/contest/1080/problem/C
题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白相间分布。有俩个操作,第一个操作是选定一个矩阵用白色给覆盖,第二个操作选定一个矩阵用黑色覆盖,问最后的白色块和黑色块各是多少?
分析:我们先分别独立地求这俩次操作,然后因为黑色覆盖在后,所以我们就把俩次操作可能相交的部分进行减去相应的贡献即可,也就是对面积交进行处理。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll area(ll x1,ll y1,ll x2,ll y2){ ll a=x2-x1+1,b=y2-y1+1; ll ans=a*b/2; if(a*b%2!=0&&((x1+y1)%2==0)) ans++; return ans; } ll cross(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3,ll x4,ll y4){ ll lx=max(x1,x3); ll ly=max(y1,y3); ll rx=min(x2,x4); ll ry=min(y2,y4); if(lx>rx||ly>ry) return 0; ll a=rx-lx+1,b=ry-ly+1; ll ans=a*b/2; if(a*b%2!=0&&((lx+ly)%2==0)) ans++; return a*b-ans; } int main() { int t; cin>>t; while(t--){ ll n,m; cin>>n>>m; ll x1,y1,x2,y2,x3,y3,x4,y4; cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4; ///单独对第一次操作进行统计 ll sw=n*m/2;//w if((n*m)&1) sw++; sw+=(x2-x1+1)*(y2-y1+1)-area(x1,y1,x2,y2);///加上覆盖白后增加的S ///单独对第二次操作进行统计 ll fullblack=area(x3,y3,x4,y4); ///面积交的部分 ll Sjiao=cross(x1,y1,x2,y2,x3,y3,x4,y4); ///处理答案 ll ans=sw-fullblack-Sjiao; cout<<ans<<" "<<n*m-ans<<endl; } return 0; }