開啟章節選單
11639 Guard the Land
題目連結
題目翻譯
農夫 Latif 有一塊 100×100 公尺的矩形農地,每晚他雇兩個警衛分別看守一個矩形區域。
- 強安全:兩個警衛都覆蓋到的區域
- 弱安全:只有一個警衛覆蓋到的區域
- 不安全:兩個警衛都沒覆蓋到的區域
給你兩個矩形的座標,計算三種區域各自的面積(單位:m²)。
輸入
第一行測資數 N(N ≤ 100),接下來 N 組,每組兩行,每行四個整數 x1 y1 x2 y2,分別是矩形左下角和右上角座標(0 ≤ 座標 ≤ 100)。
輸出
每組輸出 Night t: A B C,A 是強安全面積,B 是弱安全面積,C 是不安全面積。
解題思路
設兩個矩形面積分別為 a、b,兩者交集面積為 c:
- 強安全 = c(兩個都覆蓋)
- 弱安全 = a + b − 2c(各自有覆蓋但對方沒有,即 (a−c) + (b−c))
- 不安全 = 10000 − a − b + c(總面積 − 聯集面積,聯集 = a + b − c)
交集寬度:max(0, min(x2,x4) − max(x1,x3)),高度同理,相乘得 c。
程式碼
//author: Piau #include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define INF LONG_LONG_MAX/1000 #define WA() cin.tie(0)->sync_with_stdio(0) #define all(x) (x).begin(), (x).end() #define int long long #define PII pair<int, int> signed main() { WA(); int t = 1, T; for (cin >> T; t <= T; t++) { cout << "Night " << t << ": "; int x1, y1, x2, y2, x3, y3, x4, y4; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; int a = (x2 - x1) * (y2 - y1); int b = (x4 - x3) * (y4 - y3); int c = max(0LL, min(x2, x4) - max(x1, x3)) * max(0LL, min(y2, y4) - max(y1, y3)); cout << c << ' ' << a+b-2*c << ' ' << 10000-a-b+c << '\n'; } }