Codeforces Round #524 (Div. 2)C. Masha and two friends(容斥定理)

传送门

题意:先给出一个n行m列的矩阵,这个矩阵是黑白交错的,左下角是白的,然后再给出一个矩阵,这个矩阵就全部染成白色的,之后再给出一个矩阵,这个矩阵染成黑色的,数据范围是1e9,问最后白色块和黑色块分别由多少?

题解:首先可以算出这个大矩阵的黑色块和白色块分别有多少个,然后我们算下要染成白色矩阵中的白色和黑色块的个数,如果这个矩阵面积是偶数的,那么必然黑色和白色都是面积的一半,如果是奇数的呢?找找规律,白色块的纵坐标加横坐标是偶数,也就是我们只用判一下左下角的横纵坐标相加是偶数还是奇数,也就能确定此时这个矩阵里的白色块多一个还是黑色块多一个,同理,要染成黑色的也算一下里面原来有多少个黑色块和白色块,然后还得算一下两个矩阵相交的里面的有多少个黑色块和白色块,之后我们得算出这两个矩阵面积并外的白色块和黑色块有多少个(就是除过这两个被弄过的矩阵的外围的),要算黑的用原来的总的黑的减去要染成白色的中的黑色的,再减去要染成黑色中的黑色的,之后再加上相交的黑色的,就是此时外围黑色的了,之后黑色再加一下染成黑色的那块面积,白色通过总面积减去黑色的即可算出来。

立个flag:人傻就要多做题,本年度目标是zky爷1800题,向Claris学习,Fighting for WF。

附上代码:


#include

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<

 

你可能感兴趣的:(容斥定理)