5922: 球染色
时间限制: 2 Sec 内存限制: 512 MB提交: 99 解决: 31
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
有n组球,每组有两个球,权值分别为xi, yi。
你需要对每组球染色,一个染成红色,一个染成蓝色。
Rmax, Rmin, Bmax, Bmin分别表示红色的球中权值最大的,红色的球中权值最小的,
蓝色的球中权值最大的,蓝色的球中权值最小的。
你的目标是最小化(Rmax − Rmin) × (Bmax − Bmin),输出这个值。
你需要对每组球染色,一个染成红色,一个染成蓝色。
Rmax, Rmin, Bmax, Bmin分别表示红色的球中权值最大的,红色的球中权值最小的,
蓝色的球中权值最大的,蓝色的球中权值最小的。
你的目标是最小化(Rmax − Rmin) × (Bmax − Bmin),输出这个值。
输入
第一行一个整数n。
接下来n行每行两个整数xi, yi。
接下来n行每行两个整数xi, yi。
输出
一行一个整数表示答案。
样例输入
2
3 7
2 5
样例输出
2
提示
第一组球中权值为3的球染成红色,权值为7的球染成蓝色。
第二组球中权值为2的球染成红色,权值为5的球染成蓝色。
(Rmax − Rmin) × (Bmax − Bmin) = (3 − 2) × (7 − 5) = 2
对于前10%的数据:n ≤ 20
对于前20%的数据:n ≤ 50
对于前40%的数据:n ≤ 200
对于前70%的数据:n ≤ 2000
对于所有数据:
1 ≤ n ≤ 105,1 ≤ xi, yi ≤ 109
来源
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
typedef pair<ll,ll>PA;
pair<ll,ll>P;
vector<PA> V;
multiset<ll>R,B;
int main()
{
ll n,x,y,ans;
scanf("%lld", &n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld", &x, &y);
V.push_back(make_pair(min(x,y),max(x,y)));
R.insert(min(x,y));
B.insert(max(x,y));
}
ans=(*R.rbegin()-*R.begin())*(*B.rbegin()-*B.begin());
for(int i=0;i<V.size();i++)
{
R.erase(R.find(V[i].first));
B.insert(V[i].first);
B.erase(B.find(V[i].second));
R.insert(V[i].second);
ans=min(ans, (*R.rbegin()-*R.begin())*(*B.rbegin()-*B.begin()));
}
printf("%lld\n", ans);
return 0;
}
/**************************************************************
Problem: 5922
User: ldu_reserver201701
Language: C++
Result: 正确
Time:696 ms
Memory:13028 kb
****************************************************************/