Codeforces Round #524 (Div. 2)C. Masha and two friends(容斥定理)
阿新 • • 發佈:2018-12-26
題意:先給出一個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; }