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 }

猜你喜欢

转载自www.cnblogs.com/Ycourage/p/10012947.html