1. 程式人生 > >Codeforces Round #524 (Div. 2) Masha and two friends

Codeforces Round #524 (Div. 2) Masha and two friends

題目連結:C. Masha and two friends

  一個矩形,黑白塊按規律分佈。A同學選定一個矩形區域,將該區域全塗改成白色;B同學後選定一個區域,將該區域全塗改成黑色。那麼結束後,白塊、黑快的數量是多少。

  一個矩形兩個點,左下和右上。有一個規律:如果左下點是白色,那麼以該點為左下的矩形中,白塊數量總不少於黑塊。如果左下是黑色,那麼黑塊總不少於白塊。

  定義一個操作OP,A同學執行可以把區域中的黑塊變白塊,B則可把白變黑。

  假設A、B同學都在初始分佈的情況下操作該矩形,得到 答案一。如果兩同學操作的區域不重合,那麼答案一就是最終答案。如果有重合,重合的區域是A操作完的,裡面的黑已變成白。但在假設下,B同學操作時它依舊是黑的,所以B沒有把這些白塊(A塗的)變黑,所以 黑塊的答案少了,白塊的答案多了,少或多的塊數就是 重合區域在初始分佈下的黑塊數量,修改答案即可。

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 typedef long long ll;
  5 
  6 ll n,m;
  7 ll black,white;
  8 
  9 void get(ll a,ll b,ll c,ll d,int tag)
 10 {
 11     ll s=(c-a+1)*(d-b+1);
 12     ll bl,wh;
 13     bl=wh=s/2;
 14     if((a&1)&&(b&1
)||!(a&1)&&!(b&1)) 15 { 16 if(s%2!=0) 17 wh++; 18 // cout<<"##"<<wh<<" "<<bl<<endl; 19 if(tag==1) { 20 black-=bl; 21 white+=bl; 22 } 23 else { 24 white-=wh;
25 black+=wh; 26 } 27 } 28 else 29 { 30 if(s%2!=0) 31 bl++; 32 if(tag==1) { 33 black-=bl; 34 white+=bl; 35 } 36 else { 37 white-=wh; 38 black+=wh; 39 } 40 } 41 // cout<<"**"<<black<<" "<<white<<endl; 42 } 43 44 bool nocross(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3,ll x4,ll y4) 45 { 46 if(x1>x4||x2<x3||y2<y3||y4<y1) 47 return true; 48 else 49 return false; 50 } 51 52 void reget(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3,ll x4,ll y4) 53 { 54 ll a,b,c,d; 55 a=max(x1,x3); 56 b=max(y1,y3); 57 c=min(x2,x4); 58 d=min(y2,y4); 59 // cout<<"CC"<<a<<" "<<b<<" "<<c<<" "<<d<<endl; 60 ll s=(c-a+1)*(d-b+1); 61 ll bl,wh; 62 bl=wh=s/2; 63 if((a&1)&&(b&1)||!(a&1)&&!(b&1)) 64 { 65 if(s%2!=0) 66 wh++; 67 } 68 else 69 { 70 if(s%2!=0) 71 bl++; 72 } 73 black+=bl; 74 white-=bl; 75 } 76 77 int main() 78 { 79 int T; 80 cin>>T; 81 ll x1,y1,x2,y2; 82 ll x3,y3,x4,y4; 83 while(T--) { 84 cin>>n>>m; 85 black=white=n*m/2; 86 if(n*m%2!=0) 87 white++; 88 cin>>x1>>y1>>x2>>y2; 89 cin>>x3>>y3>>x4>>y4; 90 get(x1,y1,x2,y2,1); 91 get(x3,y3,x4,y4,2); 92 if(nocross(x1,y1,x2,y2,x3,y3,x4,y4)){ 93 cout<<white<<" "<<black<<endl; 94 continue; 95 } 96 reget(x1,y1,x2,y2,x3,y3,x4,y4); 97 cout<<white<<" "<<black<<endl; 98 } 99 return 0; 100 }