农夫约翰的 NN 头奶牛分布在其二维农场的不同位置。
约翰想用一个长方形的围栏把所有的奶牛围起来,围栏的边需要平行于 xx 轴和 yy 轴。
在能够包含所有奶牛的情况下(处于围栏边界的奶牛也算包含在内),约翰希望围栏围起的面积尽可能小。
不幸的是,由于上个季度的牛奶产量很低,约翰的预算十分紧张。
因此,他希望建立一个更小的围栏,甚至为了实现这一目标,他愿意卖掉农场中的一头奶牛。
请帮助约翰计算,卖掉牛群中的一头奶牛以后,他可以用围栏围起来的最小面积(为剩下的奶牛建造尽可能小的围栏)。
对于这个问题,请将奶牛视为点,将围栏视为四个线段的集合。
注意,答案可以是零,例如,所有剩余的奶牛最终都站在同一条垂直或水平线上。

输入格式

第一行包含整数 NN。
接下来 NN 行,每行包含两个整数 x,yx,y,表示一头牛所在的位置坐标为 (x,y)(x,y)。

输出格式

输出卖掉牛群中的一头奶牛以后,约翰可以用围栏围起来的最小面积。

数据范围

3≤N≤500003≤N≤50000,
1≤x,y≤400001≤x,y≤40000

输入样例:

4 2 4 1 1 5 2 17 25

输出样例:

12


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 50010;
  6. int a[N], b[N], x[N], y[N];
  7. int n;
  8. int main() {
  9. cin >> n;
  10. for (int i = 0; i < n; ++i) {
  11. scanf("%d %d",&a[i],&b[i]);
  12. x[i] = a[i]; y[i] = b[i];
  13. }
  14. sort(x,x + n);
  15. sort(y,y + n);
  16. int res = 2e10;
  17. for (int i = 0; i < n; ++i) {
  18. //x最小值最大值,y最小值最大值
  19. int x1,x2,y1,y2;
  20. x1 = a[i] == x[0] ? x[1] : x[0];
  21. x2 = a[i] == x[n-1] ? x[n-2] : x[n-1];
  22. y1 = b[i] == y[0] ? y[1] : y[0];
  23. y2 = b[i] == y[n-1] ? y[n-2] : y[n-1];
  24. res = min(res,(x2 - x1) * (y2 - y1));
  25. }
  26. cout << res << endl;
  27. return 0;
  28. }