1. 程式人生 > >兩個矩形面積交

兩個矩形面積交

http://codeforces.com/contest/1080/problem/C

題意:

給你一個n*m的棋盤,最初(1,1)上為白色,而且每個相鄰的塊顏色都不同。之後有兩次操作,第一次操作給出x1,y2,x2,y2將(x1,y1,x2,y2)這個矩形塗為白色第二次操作給出x3,y3,x4,y4
將(x3,y3,x4,y4)這個矩形塗為黑色
後塗得會覆蓋之前的顏色。問最終的棋盤上黑色和白色的個數

解法:

可以發現,矩形白色個數是由左下角的顏色和行數列數奇偶性決定的。

先算出原矩形白色個數,

加上黑變白的個數,

減去白變黑的個數。

如果兩個矩形沒有相交答案就是上述過程的答案。

如果有相交就是減去相交區域黑色的個數,

相當於黑變白的個數減少了。

 1 /*************************************************************************
 2     > File Name: 矩形面積交.cpp
 3     > Author: QWX
 4     > Mail: 
 5     > Created Time: 2018/11/24 14:24:14
 6  ************************************************************************/
7 8 9 //{{{ #include 10 #include<iostream> 11 #include<cstdio> 12 #include<algorithm> 13 #include<vector> 14 #include<cmath> 15 #include<queue> 16 #include<map> 17 #include<set> 18 #include<string> 19 #include<cstring> 20 #include<complex> 21
#include<cassert> 22 //#include<bits/stdc++.h> 23 #define vi vector<ll> 24 #define pii pair<ll,ll> 25 #define mp make_pair 26 #define pb push_back 27 #define fi first 28 #define se second 29 #define pw(x) (1ll << (x)) 30 #define sz(x) ((ll)(x).size()) 31 #define all(x) (x).begin(),(x).end() 32 #define rep(i,l,r) for(ll i=(l);i<(r);i++) 33 #define per(i,r,l) for(ll i=(r);i>=(l);i--) 34 #define FOR(i,l,r) for(ll i=(l);i<=(r);i++) 35 #define cl(a,b) memset(a,b,sizeof(a)) 36 #define fastio ios::sync_with_stdio(false);cin.tie(0); 37 #define lson l , mid , ls 38 #define rson mid + 1 , r , rs 39 #define INF 0x3f3f3f3f 40 #define LINF 0x3f3f3f3f3f3f3f3f 41 #define ll long long 42 #define ull unsigned long long 43 #define dd(x) cout << #x << " = " << (x) << "," 44 #define de(x) cout << #x << " = " << (x) << "\n" 45 #define endl "\n" 46 using namespace std; 47 //}}} 48 49 ll n,m; 50 ll area(ll x1,ll y1,ll x2,ll y2) 51 { 52 ll a=x2-x1+1,b=y2-y1+1; 53 ll ans=a*b/2; 54 55 if(a*b%2!=0&&((x1+y1)%2==0))ans++; 56 // dd(a),dd(b),de(ans); 57 return ans; 58 } 59 60 ll cross(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3,ll x4,ll y4) 61 { 62 ll lx=max(x1,x3); 63 ll ly=max(y1,y3); 64 ll rx=min(x2,x4); 65 ll ry=min(y2,y4); 66 if(lx>rx)return 0; 67 if(ly>ry)return 0; 68 ll a=rx-lx+1,b=ry-ly+1; 69 ll ans=a*b/2; 70 // dd(lx),dd(ly),dd(rx),dd(ry);dd(a),dd(b),de(ans); 71 if(a*b%2!=0&&((lx+ly)%2==0))ans++; 72 return a*b-ans; 73 } 74 75 int main() 76 { 77 ll T; cin>>T; 78 while(T--){ 79 ll n,m; cin>>n>>m; 80 ll x1,y1,x2,y2,x3,y3,x4,y4; 81 cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4; 82 ll s1=n*m/2+(n*m%2?1:0); 83 ll s2=(x2-x1+1)*(y2-y1+1)-area(x1,y1,x2,y2); 84 ll s3=area(x3,y3,x4,y4); 85 ll s4=cross(x1,y1,x2,y2,x3,y3,x4,y4); 86 ll ans=s1+s2-s3-s4; 87 // dd(s1),dd(s2),dd(s3),de(s4); 88 cout<<ans<<" "<<n*m-ans<<endl; 89 } 90 return 0; 91 }
View Code