农夫约翰的 NN 头奶牛分布在其二维农场的不同位置。
约翰想用一个长方形的围栏把所有的奶牛围起来,围栏的边需要平行于 xx 轴和 yy 轴。
在能够包含所有奶牛的情况下(处于围栏边界的奶牛也算包含在内),约翰希望围栏围起的面积尽可能小。
不幸的是,由于上个季度的牛奶产量很低,约翰的预算十分紧张。
因此,他希望建立一个更小的围栏,甚至为了实现这一目标,他愿意卖掉农场中的一头奶牛。
请帮助约翰计算,卖掉牛群中的一头奶牛以后,他可以用围栏围起来的最小面积(为剩下的奶牛建造尽可能小的围栏)。
对于这个问题,请将奶牛视为点,将围栏视为四个线段的集合。
注意,答案可以是零,例如,所有剩余的奶牛最终都站在同一条垂直或水平线上。
输入格式
第一行包含整数 NN。
接下来 NN 行,每行包含两个整数 x,yx,y,表示一头牛所在的位置坐标为 (x,y)(x,y)。
输出格式
输出卖掉牛群中的一头奶牛以后,约翰可以用围栏围起来的最小面积。
数据范围
3≤N≤500003≤N≤50000,
1≤x,y≤400001≤x,y≤40000
输入样例:
输出样例:
12
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 50010;
int a[N], b[N], x[N], y[N];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d %d",&a[i],&b[i]);
x[i] = a[i]; y[i] = b[i];
}
sort(x,x + n);
sort(y,y + n);
int res = 2e10;
for (int i = 0; i < n; ++i) {
//x最小值最大值,y最小值最大值
int x1,x2,y1,y2;
x1 = a[i] == x[0] ? x[1] : x[0];
x2 = a[i] == x[n-1] ? x[n-2] : x[n-1];
y1 = b[i] == y[0] ? y[1] : y[0];
y2 = b[i] == y[n-1] ? y[n-2] : y[n-1];
res = min(res,(x2 - x1) * (y2 - y1));
}
cout << res << endl;
return 0;
}