C. Masha and two friends【Codeforces 】【细节】

题目链接

题意:

给你一个棋盘(如题目所示)黑白相间,q次询问,每次询问给你一个n*m的黑白相间棋盘,再给你两个矩形的左下角和右上角的端点,第一个矩形把相应位置涂成白色,第二个矩形把相应位置涂成黑色,求有多少个黑色格子和白色格子。

分析:

处理细节就行,很麻烦

代码:

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
ll f1[10],f2[10];
int  main()
{
    ll t,i,j,n,m,aa,bb,a,b,xx,x,yy,y,l,r,p,q,pp,qq,z,zz,e1,e2;
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld%lld",&n,&m);
        r=(n*m)/2;
        l=(n*m)-r;
        scanf("%lld%lld%lld%lld",&y,&x,&yy,&xx);
        f1[0]=x;
        f1[1]=xx;
        f2[0]=y;
        f2[1]=yy;
        if((x+y)%2)
        {
            a=(yy-y+1)*(xx-x+1)/2;
            b=(yy-y+1)*(xx-x+1)-a;
        }
        else
        {
            b=(yy-y+1)*(xx-x+1)/2;
            a=(yy-y+1)*(xx-x+1)-a;
        }
        l=l+b;
        r=r-b;
        scanf("%lld%lld%lld%lld",&b,&a,&bb,&aa);
        f1[2]=a;
        f1[3]=aa;
        f2[2]=b;
        f2[3]=bb;
        sort(f1,f1+4);
        sort(f2,f2+4);
        e1=f1[1];
        e2=f2[1];
        if(e1<=xx&&e1>=x&&e2<=yy&&e2>=y&&e1<=aa&&e1>=a&&e2<=bb&&e2>=b)
        {
            p=f1[1];
            q=f2[1];
            pp=f1[2];
            qq=f2[2];
            if((p+q)%2)
            {
                z=(pp-p+1)*(qq-q+1)/2;///白色
                zz=(pp-p+1)*(qq-q+1)-z;///黑色
            }
            else
            {
                zz=(pp-p+1)*(qq-q+1)/2;
                z=(pp-p+1)*(qq-q+1)-zz;
            }
            r+=zz;
            l-=zz;
        }
        if((a+b)%2)
        {
            p=(aa-a+1)*(bb-b+1)/2;
            q=(aa-a+1)*(bb-b+1)-p;
        }
        else
        {
            q=(aa-a+1)*(bb-b+1)/2;
            p=(aa-a+1)*(bb-b+1)-q;
        }
        l-=p;
        r+=p;
        printf("%lld %lld\n",l,r);

    }
}

猜你喜欢

转载自blog.csdn.net/lml11111/article/details/84453171