説明
N-バッグは、各バッグは2つの白いボールで満たしました。2個の白いボール上記の袋の数iは、XI、YI 2つの数値を書かれていました。今染め赤と青の1に、各袋に2個のボールは、ボールに染色されました。2n個の外にボールを染色した後、定義します。
- Rmaxが赤のボールの最大数です
- Rminが赤のボールの最小数であります
- Bmaxのは、最大のデジタル青いボールです
- 青Bminの上のボールの最小数
さ(Rmax-Rminの)(Bmax-シーク Bminの) 最低。
入力は、
最初の行は、2つの数字のXI、YI(1≤xi、yi≤109)のn行続いて、整数N(1≤n≤2×105)であり 、 それは私の2つのバッグを示しボールの数字。
出力
出力線最小値(Rmaxは-Rminの)の整数を表す(Bmax- Bminの) の。
入力サンプルの
サンプル入力1:
3
1 2
3 4
5 6。
サンプル入力2:
3
1010 10
1000年1
20 1020
サンプル入力3:
2
1 1
1000000000 1000000000
サンプル出力
サンプル出力1:
15
出力例2:
380
。3出力サンプル:
999999998000000001
ヒントの
サンプル1は、最適解X1、X2、Y3赤Y2、Y2、X3ブルー染色であります
思考
色または最大/最小値としてながら、全体的な最大値と最小値を考慮し、または2つの異なる色の最大値/最小値です。これは明らかに、すべてのポイントの値の大きい方が別の色に染め小さい同じ色を、染めなければならない、比較的容易に処理することです。
グローバル最小値と最大値は、多くのトラブル同じ色であれば。あなたはこれらの2つの値が赤く染めている設定することをお勧めします。このとき、他のすべての値がない範囲の外に、赤く染めたことができます。したがって、各タップのためのポイント値に残っている問題は、最大マイナス最小青が最小ように、ブルー染色しました。
コード
#include<bits/stdc++.h>
#define N 220077
#define ll long long
using namespace std;
struct arr
{
ll x,y;
}p[N];
ll n,Rmax,Rmin,Lmax,Lmin,r,l,Max,Min;
bool operator < (arr a,arr b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
ll solve1()
{
Max=p[1].y,Min=p[1].x;r=1;l=1;
for(int i=2;i<=n;i++)
{
if(p[i].x<Min)Min=p[i].x,l=i;
if(p[i].y>Max)Max=p[i].y,r=i;
}
Rmax=Max;Lmin=Min;
Rmin=p[l].y;Lmax=p[r].x;
for(int i=1;i<=n;i++)
{
Rmin=min(Rmin,p[i].y);
Lmax=max(Lmax,p[i].x);
}
return (ll)(Rmax-Rmin)*(Lmax-Lmin);
}
ll solve2(){
Lmax=Max;
Lmin=Min;
Rmax=max(p[n].x,p[1].y);
ll k=p[1].y;
Rmin=min(p[1].y,p[2].x);
ll ans=Rmax-Rmin;
for(int i=2;i<=n-1;i++){
k=min(k,p[i].y);
Rmax=max(p[i].y,Rmax);
Rmin=min(k,p[i+1].x);
if(Rmax-Rmin<ans)ans=Rmax-Rmin;
}
return (ll)ans*(Lmax-Lmin);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
if(p[i].x>p[i].y)swap(p[i].x,p[i].y);
}
sort(p+1,p+n+1);
ll ans=solve1();
if(r!=l)ans=min(ans,solve2());
printf("%lld",ans);
return 0;
}