1. 程式人生 > >Codeforces Round #524 (Div. 2)C. Masha and two friends(容斥定理)

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

傳送門

題意:先給出一個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;
}