Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交

题: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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/starve/p/12014047.html