1. 程式人生 > >(模擬)cf#514.C.Masha and two friends

(模擬)cf#514.C.Masha and two friends

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

比賽的時候手寫相交判斷寫過樣例就交了,發現wa了,然後去網上抄了個板子再交還是wa。自閉 。然後比賽完看錯誤原因發現n,m沒開long long。但是還是發現板子要wa在第39個樣例,手寫判斷能過。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int main()
{
    int t;
    ll n, m;
    cin >> t;
    while(t--) {
        cin >> n >> m;
        ll black = (n * m) / 2;
        ll white = n * m - black;
        ll x1, y1, x2, y2, x3, y3, x4, y4;
        cin >> x1 >> y1 >> x2 >> y2;
        ll w = x2 - x1 + 1, h = y2 - y1 + 1;
        if((x1 + y1) & 1) { //black more
            ll a = (w * h) / 2;
            ll b = w * h - a;
            black -= b;
            white += b;
        }
        else {
            ll b = (w * h) / 2;
            ll a = w * h - b;
            black -= b;
            white += b;
        }
        //cout << white << " " << black << endl;
        cin >> x3 >> y3 >> x4 >> y4;
        w = x4 - x3 + 1, h = y4 - y3 + 1;
        if((x3 + y3) & 1) {
            ll a = (w * h) / 2;
            black += a;
            white -= a;
        }
        else {
            ll b = (w * h) / 2;
            ll a = w * h - b;
            black += a;
            white -= a;
        }
        ll a = max(x1, x3), b = min(x2, x4), c = max(y1, y3), d = min(y2, y4);
        if(a <= b && c <= d) white -= ((b - a + 1) * (d - c + 1) + (a + c) % 2) / 2, black += ((b - a + 1) * (d - c + 1) + (a + c) % 2) / 2;
        //處理重複黑塊
        cout << white << " " << black << endl;
    }
}

那個板子,不知道怎麼錯了

設A[x01,y01,x02,y02]  B[x11,y11,x12,y12].
矩形A和矩形B物理中心點X方向的距離為Lx:abs( (x01+x02)/2 – (x11+x12) /2)
矩形A和矩形B物理中心點Y方向的距離為Ly:abs( (y01+y02)/2 – (y11+y12) /2)
矩形A和矩形B X方向的邊長為 Sax:abs(x01-x02)  Sbx: abs(x11-x12)
矩形A和矩形B Y方向的邊長為 Say:abs(y01-y02)  Sby: abs(y11-y12)
如果AB相交,則滿足下列關係:
Lx <= (Sax + Sbx)/2 && Ly <=(Say+ Sby)/2