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

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

 

題目

 

題意

     給一個n*m塊大的黑白相間的矩形,在這個舉行中操作,要先把第一個矩形(左下角座標(x1,y2),右上角座標(x2,y2)) 全部塗成白色,再把第二個矩形(左下角座標(x3,y3),右上角座標(x4,y4))  全部塗成黑色。 求塗了這兩個矩形之後的 白色塊數量和黑色塊數量。

 

思路

    上圖。因為在第二步中全塗成黑色,可能會  覆蓋第一個矩形的一部分。如果先求白色塊,然後通過n*m-白色再求出黑色的方法,不太好求。所以先求黑色塊數量,再通過n*m-黑色 求白色。

    答案黑色塊的數量設為numblack ( 即nb ),nb = n*m中總的黑色數量  - s1中的黑色數量 - s2中的黑色數量 - s3中的黑色數量 + (s2+s3)的面積,    等價於nb = n*m中總的黑色數量  - (s1+s2)中的黑色數量 -  (s2+s3)中的黑色數量 + s2中的黑色數量 + (s2+s3)的面積。這樣比較好求。

    而求一個矩形中黑色方塊的數量,容易知道不是 白==黑 ,就是 白與黑相差為1(其中矩形左下角是黑色的話,黑色的數量就會比白色多1,這也是必要條件)   

     xx1=max(x[1],x[3]);
     xx2=min(x[2],x[4]);
     yy1=max(y[1],y[3]);
     yy2=min(y[2],y[4]);  如果  xx1<=xx2 && yy1<=yy2 ,則有重疊面積,s2部分存在。

 

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4
#include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=1000000007; 20 const int INF= 0x3f3f3f3f; 21 const int inf= 1000002; 22 const int N=1e5+5; 23 24 int t,n,m; 25 ll x[5],y[5]; 26 ll nb; 27 28 ll numblack(ll x1,ll y1,ll x2,ll y2) 29 { 30 // 矩形裡 黑色數量要+1的唯一情況: 31 if((x2-x1+1)%2==1 && (y2-y1+1)%2==1 && (x1+y1)%2==1) 32 return (x2-x1+1)*(y2-y1+1)/2 +1; 33 else 34 return (x2-x1+1)*(y2-y1+1)/2 ; 35 } 36 37 int main() 38 { 39 cin>>t; 40 while(t--) 41 { 42 scanf("%d%d",&n,&m); 43 for(int i=1;i<=4;i++) 44 scanf("%d%d",&x[i],&y[i]); 45 46 nb = numblack(1,1,m,n); 47 nb-= numblack( x[1],y[1],x[2],y[2] ); 48 nb-= numblack( x[3],y[3],x[4],y[4] ); 49 50 ll xx1=max(x[1],x[3]); 51 ll xx2=min(x[2],x[4]); 52 ll yy1=max(y[1],y[3]); 53 ll yy2=min(y[2],y[4]); 54 if(xx1<=xx2 && yy1<=yy2) //如果重疊 加上重合部分(容斥定理) 55 nb+= numblack( xx1,yy1,xx2,yy2 ); 56 57 nb+= (x[4]-x[3]+1)*(y[4]-y[3]+1); 58 cout<<1LL*n*m-nb<<' '<<nb<<endl; 59 } 60 }
View Code