Codeforces Round #524 (Div. 2) C. 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 }