洛谷 P11011 點的覆蓋
題意
給定一個四邊平行於座標軸的矩形 \(A\),給定 \(n\) 個在矩形 \(A\) 內部(可能在邊緣上)的點。
求有多少個 \(A\) 的子矩形覆蓋了所有 \(n\) 個點(允許在邊緣上)。
所有座標都是整數。
思路
求出:\(X_1=\max_{i=1}^n x_i\),\(X_2=\min_{i=1}^n x_i\),\(Y_1=\max_{i=1}^n y_i\),\(Y_2=\min_{i=1}^n y_i\)。
記矩形左上角座標為 \((x,y)\),右下角座標為 \((X,Y)\),設點 \(P(X_2,Y_1)\) 和 \(Q(X_1,Y_2)\) 如圖:
容易發現子矩形的左上角只能在左上角的黑色矩形中,右下角只能在右下角的黑色矩形中。
算出兩個矩形中有多少個整點,相乘即可。
左上角為 \((x,y)\),右下角為 \((X,Y)\) 的矩形中整點的個數為 \((X-x+1)(y-Y+1)\)。
程式碼
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n, X1, Y1, X2, Y2;
int xmax, xmin, ymax, ymin;
int main() {
cin >> n >> X1 >> Y1 >> X2 >> Y2;
xmin = ymin = 1e9;
for (int i = 1, x, y; i <= n; i ++) {
cin >> x >> y;
xmin = min(xmin, x);
xmax = max(xmax, x);
ymin = min(ymin, y);
ymax = max(ymax, y);
}
ll z = (xmin - X1 + 1) * (Y1 - ymax + 1) % mod;
ll y = (X2 - xmax + 1) * (ymin - Y2 + 1) % mod;
ll ans = z * y % mod;
cout << ans << "\n";
return 0;
}