两个矩形面积交
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 }